繁体   English   中英

如何使C ++ DLL调用重载的全局new运算符?

[英]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,您可以让它们通过以下方式调用重载方法

  1. 确保调用代码包含定义您的重载的标头
  2. 通过在导出文件中指定它们来从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM