【发布时间】:2011-01-01 17:05:05
【问题描述】:
我正在为一个大型闭源应用程序维护一个插件(实现为 dll)。这多年来一直运行良好。然而,随着其 SDK 的最新更新,供应商重载了全球运营商 new 和 delete。这给我带来了很多麻烦。发生的事情是我的插件分配了一个字符串。我将此字符串传递给一个静态链接库,该库对其进行修改(更改它的长度,从而重新分配它)。我的应用程序崩溃了。
原因当然是字符串位于供应商分配的自定义堆上。静态链接库对此堆一无所知,并尝试在该内存上使用默认的 new/delete 运算符。轰隆隆。
现在的问题是:如何保持我的代码干净并避免使用供应商的运算符?没有条件预处理器宏。我无法避免包含有问题的标头,因为它包含我需要的插件多 2000 行代码。我无法将提供的分配器传递到另一个库,因为它没有为此提供任何机制。我已经向供应商提出了这个问题。我不知道我还能尝试什么?
附录:经过一番激烈的辩论,我设法说服供应商再次从 SDK 的下一个版本中删除重载。我通过简单地破解当前的 SDK 并手动删除重载解决了我的直接问题。感谢此线程中的所有建议。它们充当了论据,并进一步“证明”了为什么重载首先是一个坏主意。
【问题讨论】:
-
必须避免更改静态库吗?
-
我可以在这种情况下更改它,因为它是开源的。但我真的很想避免在每个新版本中升级我的修改。我也更喜欢与我没有源访问权限的库一起使用的解决方案......
-
另外,你说的是std::string、char*s还是其他类型的字符串?
-
如果库重新分配您的字符串 并且 不提供对其分配器的访问权限,您将无能为力。继续烦他们,他们的图书馆坏了。
-
char * 在这种特殊情况下。但我认为这实际上无关紧要,因为问题仍然存在于所有分配中。
标签: c++ operator-overloading memory-management new-operator allocation