如果我在我的库中使用new
关键字(该库与我的主应用程序构建方式不同),当我在主应用程序中使用delete
删除它时,是否有可能导致崩溃/错误?
new
和delete
将使用相同的堆。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.
}
确实如此。具体来说,您会发现在调试/发布堆中存在问题,如果您的库使用了放置new或任何自定义的堆,则会出现问题。但是,调试/发布问题是最常见的。
是的,你需要。一个简单的解决方案是在你的库中提供创建和删除功能,这些功能可以从主应用程序中调用。创建函数将执行新建并返回一个指针,稍后传入删除函数进行删除。
Old New Thing之前已经讨论过这个问题。他还列出了微软的主要解决方案。
class NewDelete
{
public:
void *operator new (size_t size);
void operator delete (void *memory);
void *operator new (size_t size, void *ptr);
void operator delete (void *memory, void *ptr);
};