我重载了全局new/delete(和new[] / delete[])来填充和检查保护块。工作正常。现在我链接到C++ DLL,传递由DLL填充或修改的STL-Container示例。当析构这些容器时,我遇到错误,因为它们不是使用我的重载new运算符分配的,反之亦然,当释放使用我的重载new运算符创建的容器元素时,DLL会生成错误重载new。
我怎样才能使DLL调用我的新操作符?对于一些DLL,我有源代码,对于其他人,我没有它。
必须有一个整体的方法,即Visual Studio运行时DLL MSVCP*.DLL调用我的重载运算符。我如何让其他DLL也调用我的运算符?
a)有DLL的源代码?并检查B)没有DLL的源代码?
3条答案
按热度按时间vlf7wbxs1#
对于你可以编译的dll,你可以让它们调用你的重载方法
1.确保调用代码包含定义重载的标头
1.通过在导出文件中指定这些重载来从dll中导出它们
下面是new/delete/new[]/delete[]的导出(使用了混乱的名称,从未找到其他方法),抛出版本。
x86:
x64:
我不认为这适用于你没有自己编译的dll(在它们构建的时候,链接器已经负责查找方法的引用);要做到这一点,您可能不得不使用相当肮脏的技巧,如为您的进程挂接CRT。
edit反过来,你可以将分配器从宿主应用程序传递到dll中,并确保dll只使用这些分配器进行分配,而不是new/delete。让这些分配器依次调用你重载的new/delete。这有点混乱,但应该可以工作,也可以使用STL,因为你可以为这些容器指定分配器;但是,如果你想要一个dll,而你没有代码来使用你的边界检查代码进行分配,那么这并不能解决任何问题。
juzqafwq2#
我认为你需要把new/delete代码放在一个DLL中,并确保exe和你的额外DLL都调用这个公共代码。
即使这种方法也有问题,所以对我来说,最好在架构上确保分配内存块的模块与删除它的模块是同一个模块,但这不是一个简单的要求,在许多情况下。
8mmmxcuj3#
我需要做同样的事情,并通过在头文件中将new、new[]、delete和delete[]操作符声明为 inline,轻松地摆脱了混乱。
然后两个new都调用源文件中的同一个函数(比如“mynew”)。
而mynew和mydelete则以通常的方式导出和导入。
至少对我有用。