如何为 dll
重载 new
和 delete
运算符。我已经在 dll
中编写了重载的运算符,但与该 dll
链接的客户端没有使用 重载的 new 和 delete
如何为 dll
重载 new
和 delete
运算符。我已经在 dll
中编写了重载的运算符,但与该 dll
链接的客户端没有使用 重载的 new 和 delete
inline
才能满足一次定义规则(ODR),而这反过来又不能满足上述条款。不将它们标记为inline
的要求可能是因为标记为inline
的函数定义具有“无链接”,导致每个翻译单元使用其自己编译的版本(或作为内联扩展),通常没问题,但对于动态内存分配则不然。new
分配的内存使用相应的delete
操作符进行释放(即“编译在一起”,可以这么说,或者都默认)。例如,如果您的新/删除操作符依赖于底层的malloc/free调用,则依赖于调用新/删除操作符的翻译单元所使用的堆,在DLL和可执行文件之间,不能保证此堆将是相同的(实际上,在特定情况下,在Windows中,两个模块使用两个单独的堆进行动态内存分配)。std::shared_ptr
),其中包含一个自定义删除器,该删除器依赖于将删除操作动态分派回对象创建的位置。这是受Chad Austin技术启发的一种方法。我在这里做了非常类似的事情。inline
标记该定义,这与在类声明中定义它相同。因此,无论是将其放入类声明中还是显式标记为 inline
,都需要将其标记为 inline
。两种方法都是完全等效的。 - Mikael PerssonMODULE_START()
// CODE HERE
MODULE_END()
这个应该能顺利运行。
new
和delete
,还是试图在应用程序中全局重新定义它们?你能否重建客户端应用程序,或者你尝试修改预构建二进制文件的行为? - Rook