c++ - 一个图书馆强制我在全局范围内重载新的/删除的!

标签 c++ operator-overloading memory-management new-operator allocation

我正在为一个大型闭源应用程序维护一个插件(作为 dll 实现)。这多年来一直运作良好。但是,随着对其 SDK 的最新更新,供应商重载了全局运算符 new 和 delete。这给我带来了很多麻烦。发生的事情是我的插件分配了一个字符串。我将这个字符串传递到一个静态链接库中,该库会修改它(更改它的长度,从而重新分配它)。我的应用程序崩溃了。

原因当然是,字符串位于供应商分配的自定义堆上。静态链接库对这个堆一无所知,并尝试在该内存上使用默认的新建/删除操作符。繁荣。

现在的问题是:如何保持我的代码干净并避免使用供应商的运算符?没有条件预处理器宏。我无法避免包含有问题的 header ,因为它包含插件所需的 2000 行代码。我无法将提供的分配器传递给另一个库,因为它没有为此提供任何机制。我已经打扰了供应商。我不知道我还能尝试什么?

附录: 经过一番激烈的辩论,我成功地说服了供应商从下一版本的 SDK 中再次删除过载。我已经通过简单地破解当前 SDK 并手动删除重载来解决了我眼前的问题。感谢您在此线程中提出的所有建议。它们充当论据并进一步“证明”为什么重载首先是一个坏主意。

最佳答案

如果您正在编译(通过 header 包含)一个覆盖的新建/删除运算符,那么您代码中对新建/删除的所有调用都将使用它们。无法重新覆盖它(链接错误)或只能部分覆盖它,等等。

覆盖全局新建/删除操作符是一种糟糕的形式。这是个坏主意。如果你不明白为什么这是个坏主意,你就没有资格这样做。如果你确实意识到为什么这是个坏主意,你就有资格这样做,但你通常会选择不这样做。

在您希望人们将其直接包含到他们的项目中的组件中,定义一个全局的新建/删除是更加邪恶的。作为客户,您的职责是帮助这样做的供应商了解情况的严重性,或者停止成为他们的客户。

您可以定义自定义分配器类型(请参阅 link for a good tutorial 了解如何执行此操作、需要的接口(interface)等)并将其专门用于您的 STL 类型(它是一个模板参数)。

对于 shared_ptr,你需要做一些不同的事情:如果你不想要默认的“删除 p”行为,它需要一个删除对象作为构造函数的参数。这不是自定义分配器;它只是一个普通的一元仿函数。

关于c++ - 一个图书馆强制我在全局范围内重载新的/删除的!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2007274/

相关文章:

c# - 'as' 的重载/隐式运算符

c - 对齐内存管理?

ubuntu 上的 Java 内存不足,但存在大量缓存内存

c++将char数组传递给函数并更改它

c++ - 如何使用具有两列的模型获取 QComboBox 的当前值?

c++ - 使用模板重载运算符 ()

c++ - 隐式转换运算符不参与运算符重载

c++ - 内存密集型应用程序中的内存管理

c++ - 如何在C/C++中保存数据?

c++ - 如何检测窗口何时收到 WM_MOVE 消息