gpt4 book ai didi

C++在库之间混合新/删除?

转载 作者:IT老高 更新时间:2023-10-28 21:35:55 31 4
gpt4 key购买 nike

如果我在我的库中使用 new 关键字(其构建方式与我的主应用程序不同),当我在我的主应用程序中使用 delete 删除它时,是否存在我可能会遇到崩溃/错误吗?

最佳答案

这取决于。如果您谈论的是静态库,那么您可能会没事——代码将在与主程序相同的上下文中运行,使用相同的 C++ 运行时库。这意味着 newdelete 将使用相同的堆。

如果您谈论的是共享库(DLL),那么您可能不会好。在 DLL 中运行的代码可能使用不同的 C++ 运行时库,这意味着堆的布局会有所不同。 DLL 可能完全使用不同的堆。

在 DLL 分配的指针上调用 delete(在主程序中)(反之亦然)将导致(最好的​​情况)立即崩溃或(最坏的情况)内存损坏,花点时间追查。

您有几个选择。第一种是使用“工厂方法”模式来创建和删除这些对象:

Foo *CreateFoo();
void DeleteFoo(Foo *p);

这些应该在头文件中实现。

或者,您可以在对象上定义 Destroy 方法:

class Foo
{
~Foo();

public:
virtual void Destroy();
};

...同样,不要在头文件中实现它。你可以这样实现它:

void Foo::Destroy()
{
delete this;
// don't do anything that accesses this object past this point.
}

注意 Foo 的析构函数是私有(private)的,所以你必须调用 Foo::Destroy

Microsoft COM 做了类似的事情,它定义了一个 Release 方法,当对象的引用计数降至零时删除该对象。

关于C++在库之间混合新/删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/443147/

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