[英]How do i make a C++ DLL call my overloaded global new operator?
我已经重载了全局new / delete(和new [] / delete [])以填充并检查受保护的块。 工作正常。 现在,我链接到传递由DLL填充或修改的STL-Container实例的C ++ DLL。 销毁这些容器时,我遇到了错误,因为它们没有使用我的重载new运算符分配,反之亦然,当释放使用我的重载new创建的容器元素时,dll会产生错误。
如何使DLL调用我的新运算符? 对于某些DLL,我有源,对于其他DLL,我没有源。
必须有一个整体方法,例如Visual Studio运行时DLL MSVCP * .DLL调用我的重载运算符。 如何使其他DLL也调用我的运算符?
a)具有DLL的来源? 并检查b)没有DLL的来源?
对于可以编译的dll,您可以让它们通过以下方式调用重载方法
这里是new / delete / new [] / delete []抛出版本的导出(使用错误的名称,从未找到另一种方法)。
x86:
EXPORTS
??2@YAPAXI@Z
??3@YAXPAX@Z
??_U@YAPAXI@Z
??_V@YAXPAX@Z
x64:
EXPORTS
??2@YAPEAX_K@Z
??3@YAXPEAX@Z
??_U@YAPEAX_K@Z
??_V@YAXPEAX@Z
我认为这不适用于您没有自行编译的dll(在构建它们时,链接器已经在照顾对方法的引用); 要做到这一点,您可能不得不使用一些肮脏的技巧,例如将crt挂接到您的过程中。
进行另一种编辑 ,您可以将宿主应用程序中的分配器传递到dll中,并确保dll仅使用那些分配器进行分配,而不使用new / delete。 Havee thos alloactor会依次调用您过载的new / delete。 有点混乱,但是应该可以与STL一起使用,因为您可以为这些容器指定分配器; 但是同样,如果您想要一个没有使用边界检查代码为其分配代码的dll,那么这将无法解决任何问题。
我认为您需要将新的/删除的代码放置在DLL中,并确保exe和您的额外DLL都调用此通用代码。
即使这种方法也有问题,所以对我而言,最好在架构上确保分配内存块的模块与删除该模块的模块相同,但是在许多情况下这并不是一个简单的要求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.