C++ VS:多 DLL 解决方案中的“新建”和“删除”覆盖
Posted
技术标签:
【中文标题】C++ VS:多 DLL 解决方案中的“新建”和“删除”覆盖【英文标题】:C++ VS: 'new' and 'delete' override in the multi-DLL solution 【发布时间】:2018-02-08 10:16:48 【问题描述】:我有一个大型解决方案,每个项目都会生成一个 dll。在其中一个中,我放置了“新”和“删除”覆盖,但看起来,它们并没有覆盖其他 dll 中的标准分配器。正常吗?对于 dll,这些覆盖是本地的吗?
作为一种解决方案,我可以编写包装函数分配器——“my_new”和“my_delete”,它们可以以我想要的任何方式工作,并使用它们来代替“new”/“delete”。但我想知道,本地 dll 之外的覆盖会发生什么。
谢谢)
【问题讨论】:
But I'd like to know, what happens with the overrides outside the their local dll.
覆盖仅适用于其本地 dll;所以本质上答案是“什么覆盖?”
您是否将这些其他 dll 链接到覆盖它们的 dll 中?
@UKMonkey,只供本地使用?好的,谢谢)
@n.m.,没听懂。我以前很少使用 dll,所以在这里我很无知。 “链接反对”是什么意思?这些项目依赖于那个内存 dll 项目,如果你的意思是这个
您的重载 dll 是否是所有其他 dll 的 link 依赖项?当您在依赖项步行器中打开其他 dll 时,您是否看到了覆盖的 dll?
【参考方案1】:
在单个 DLL 中使用时,覆盖是本地且安全的。毕竟它们是独立的可执行文件。但是您可能会遇到这样一种情况,即在 DLL 中创建的具有重载的对象被传递给在另一个 DLL 中定义的函数,最终通过标准运算符 delete 将其销毁。 (它也适用于相反的方向。)这将导致未定义的行为,通常是崩溃。
毕竟,Windows 编程的一般规则是通过同一 DLL 中的代码创建和销毁对象。因此,为了安全起见,您应该验证您的所有 DLL 是否都遵守此规则。
【讨论】:
那些包装分配器呢?任何 dll 中的任何对象都会被它们创建和销毁,这没关系,我相信? @master_clown,是的,您可以创建自己的特定函数来处理一个 DLL 中的新函数和删除函数,以供解决方案中的所有其他 DLL 使用。假设您对这些项目拥有完全的控制权,并且能够执行该模式。 完美)谢谢以上是关于C++ VS:多 DLL 解决方案中的“新建”和“删除”覆盖的主要内容,如果未能解决你的问题,请参考以下文章
C++ / VS 2012 - 多项目解决方案:一个项目中的链接器错误但另一个项目中没有
在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
Unity与DLL(C++)☀️二新建一个DLL的类库,并编写C++代码