gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:20:07 28 4
gpt4 key购买 nike

我已经重载了全局新建/删除(和新建[]/删除[])来填充和检查 protected block 。工作正常。现在我链接到 C++ DLL,传递由 DLL 填充或修改的 STL-Container 实例。当销毁这些容器时,我遇到了错误,因为它们不是使用我重载的 new 运算符分配的,反之亦然,当释放使用我的重载 new 创建的容器元素时,dll 会产生错误。

如何让 DLL 调用我的新运算符(operator)?对于某些 DLL,我有源代码,而对于其他 DLL,我没有。

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

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

最佳答案

对于你可以编译的dll,你可以让它们调用你重载的方法

  1. 确保调用代码包含定义重载的 header
  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(在构建它们时,链接器已经负责查找对方法的引用);为此,您可能不得不使用相当肮脏的技巧,例如为您的进程 Hook crt。

edit 相反,您可以将分配器从主机应用程序传递到 dll 中,并确保 dll 仅使用这些分配器进行分配,而不是新建/删除。 Have thos alloactors 依次调用您的重载新/删除。它有点乱,但应该可以工作,也可以使用 STL,因为您可以为这些容器指定分配器;但同样,如果您想要一个 dll,而您没有使用边界检查代码分配代码的 dll,这并不能解决任何问题。

关于c++ - 如何让 C++ DLL 调用我重载的全局 new 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3838237/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com