有什么一般的技巧可以确保我不会在C++程序中泄漏内存?如何确定谁应该释放已动态分配的内存?
发布于 2008-09-16 20:45:17
发布于 2008-09-16 22:38:08
我完全赞同所有关于RAII和智能指针的建议,但我还想添加一个更高级别的提示:最容易管理的内存是您从未分配过的内存。与C#和Java这样的语言不同,在C++中,只要有可能,就应该将对象放在堆栈上。正如我看到的一些人(包括Dr.Stroustrup)指出的那样,垃圾收集在C++中从未流行的主要原因是,编写良好的C++从一开始就不会产生太多垃圾。
不要写
Object* x = new Object;
甚至是
shared_ptr<Object> x(new Object);
当你可以只写
Object x;
发布于 2008-09-16 20:42:45
您将需要查看智能指针,例如boost's smart pointers。
而不是
int main()
{
Object* obj = new Object();
//...
delete obj;
}
一旦引用计数为零,boost::shared_ptr将自动删除:
int main()
{
boost::shared_ptr<Object> obj(new Object());
//...
// destructor destroys when reference count is zero
}
请注意我的上一个注释,“当引用计数为零时,这是最酷的部分。因此,如果你的对象有多个用户,你就不必跟踪该对象是否仍在使用。一旦没有人引用你的共享指针,它就会被销毁。”
然而,这并不是万能的。虽然你可以访问基指针,但除非你对它所做的事情有信心,否则你不会想把它传递给第三方API。很多时候,在创建作用域完成后,您的“发布”内容会被发送到其他线程,以便完成工作。这在Win32中的PostThreadMessage中很常见:
void foo()
{
boost::shared_ptr<Object> obj(new Object());
// Simplified here
PostThreadMessage(...., (LPARAM)ob.get());
// Destructor destroys! pointer sent to PostThreadMessage is invalid! Zohnoes!
}
像往常一样,使用任何工具来使用你的思维上限。
https://stackoverflow.com/questions/76796
复制相似问题