Bus*_*icK 5 c++ memory-management allocation operator-overloading new-operator
我正在维护一个大型闭源应用程序的插件(实现为dll).多年来一直运作良好.但是,随着SDK的最新更新,供应商重载全局运营商new和delete.这给我带来了很多麻烦.会发生什么是我的插件分配一个字符串.我将此字符串传递给静态链接库,该库修改它(更改它的长度,从而重新分配它).我的应用程序崩溃了.
原因当然是字符串存在于供应商分配的自定义堆上.静态链接库对此堆一无所知,并尝试在该内存上使用默认的new/delete运算符.繁荣.
现在的问题是:如何保持代码清洁并避免使用供应商的运营商?没有条件预处理器宏.我无法避免包含有问题的标题,因为它包含了2000行以上的插件所需的代码.我不能将提供的分配器传递到另一个库,因为它没有提供任何机制.我已经对供应商提出了相关问题.我不知道还能尝试什么?
附录:经过激烈的辩论后,我设法说服供应商再次从下一版本的SDK中删除重载.我通过简单地破解当前的SDK并手动删除重载来解决我的直接问题.感谢这个帖子中的所有建议.他们作为争论并进一步"证明"为什么重载首先是一个坏主意.
如果您正在编译(通过标头包含)一个被覆盖的 new/delete 运算符,那么您的代码中对 new/delete 的所有调用都将使用它们。无法重新覆盖它(链接错误)或仅部分覆盖它等。
完全覆盖全局 new/delete 操作符是一种糟糕的形式。这是个坏主意。如果你不明白为什么这是一个坏主意,你就没有资格这样做。如果您确实意识到为什么这是一个坏主意,那么您就有资格这样做,但您通常会选择不这样做。
在您希望人们直接包含到他们的项目中的组件中,定义全局新建/删除操作更加邪恶。作为客户,您的工作是帮助这样做的供应商了解情况的严重性,或者不再是他们的客户。
您可以定义自定义分配器类型(有关如何执行此操作、所需接口等的良好教程,请参阅此链接)并将其专门用于您的 STL 类型(它是模板参数)。
对于 shared_ptr,您需要做一些不同的事情:如果您不想要默认的“删除 p”行为,它会将删除器对象作为构造函数的参数。这不是自定义分配器;它只是一个普通的一元函子。
归档时间: |
|
查看次数: |
2301 次 |
最近记录: |