如果我在我的库中使用new关键字(它的构建与我的主应用程序不同),当我使用delete在我的主应用程序中删除它时,我是否有可能收到崩溃/错误?
发布于 2009-01-14 14:40:45
是的,确实如此。特别是,你会发现调试/发布堆的问题是不同的,如果你的库使用了placement new,或者任何定制的堆,你都会有问题。到目前为止,调试/发布问题是最常见的。
发布于 2009-01-14 15:51:22
那得看情况。如果您谈论的是静态库,那么您可能没有问题--代码将在与主程序相同的上下文中运行,并使用相同的C++运行时库。这意味着new和delete将使用相同的堆。
如果你在谈论一个共享库(一个DLL),那么你可能就不会好了。在DLL中运行的代码可能使用不同的C++运行时库,这意味着堆的布局将不同。DLL可能正在使用完全不同的堆。
在DLL分配的指针上调用delete (在主程序中)(反之亦然)将导致(最好的)立即崩溃或(最坏的)内存损坏,这将需要一段时间才能找到。
你有几个选择。第一种是使用“工厂方法”模式来创建和删除这些对象:
Foo *CreateFoo();
void DeleteFoo(Foo *p);这些不应该在头文件中实现。
或者,您可以在对象上定义Destroy方法:
class Foo
{
~Foo();
public:
virtual void Destroy();
};...again,不要在头文件中实现这一点。你可以这样实现它:
void Foo::Destroy()
{
delete this;
// don't do anything that accesses this object past this point.
}注意,Foo的析构函数是私有的,所以您必须调用Foo::Destroy。
Microsoft COM做了类似的事情,它定义了一个Release方法,当引用计数降到零时删除对象。
发布于 2009-01-14 14:54:30
是的,你会的。一个简单的解决方案是在库中提供可以从主应用程序调用的Create和Delete函数。Create函数将执行new并返回一个指针,该指针稍后被传递到Delete函数中进行删除。
https://stackoverflow.com/questions/443147
复制相似问题