如何让C ++ DLL调用我的重载全局新运算符?

时间:2010-10-01 10:11:59

标签: c++ windows dll

我已经重载全局new / delete(和new [] / delete [])来填充和检查受保护的块。工作良好。现在我链接到C ++ DLL传递由DLL填充或修改的STL-Container实例。当破坏这些容器时,我遇到了一个错误,因为它们没有使用我重载的new运算符分配,反之亦然,dll在释放使用我重载的new创建的容器元素时会产生错误。

如何让DLL调用我的新运算符? 对于某些DLL,我有源,对于其他我没有它。

必须有一个整体的方法,即Visual Studio运行时DLL MSVCP * .DLL调用我的重载运算符。如何让其他DLL也调用我的运算符?

a)拥有DLL的源代码? 并检查 b)没有DLL的来源?

2 个答案:

答案 0 :(得分:2)

对于你可以编译的dll,你可以通过

让它们调用你的重载方法
  1. 确保调用代码包含定义重载的标头
  2. 通过在导出文件中指定它们来从您的dll导出这些重载
  3. 这里是new / delete / new [] / delete [],抛出版本的导出(使用损坏的名称,从未找到另一种方法)。

    86:

    EXPORTS
      ??2@YAPAXI@Z
      ??3@YAXPAX@Z
      ??_U@YAPAXI@Z
      ??_V@YAXPAX@Z
    

    64:

    EXPORTS
      ??2@YAPEAX_K@Z
      ??3@YAXPEAX@Z
      ??_U@YAPEAX_K@Z
      ??_V@YAXPEAX@Z
    

    我不认为这适用于你自己没有编译的dll(在它们构建时,链接器已经负责找到方法的引用);要做到这一点,你可能不得不使用相当肮脏的技巧,比如为你的过程钩住crt。

    相反,

    编辑,您可以将主机应用程序中的分配器传递到dll中,并确保dll仅使用这些分配器来分配,而不是新的/删除。我们的alloactors依次调用你的重载新/删除。它有点乱,但是应该可以使用STL,因为你可以为这些容器指定分配器;但是,如果您想要一个没有使用边界检查代码分配代码的dll,这也无法解决任何问题。

答案 1 :(得分:0)

我认为您需要将新的/删除代码放在DLL中,并确保exe和您的额外DLL都调用此公共代码。

即使这种方法也存在问题,所以对我来说最好在架构上确保分配了一块内存的模块是删除它的模块,但在很多情况下这不是一个简单的要求。