首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >避免C++中内存泄漏的一般指导原则

避免C++中内存泄漏的一般指导原则
EN

Stack Overflow用户
提问于 2008-09-16 20:41:15
回答 19查看 121.8K关注 0票数 131

有什么一般的技巧可以确保我不会在C++程序中泄漏内存?如何确定谁应该释放已动态分配的内存?

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2008-09-16 20:45:17

在适当的情况下,尝试使用智能指针而不是手动管理内存。

看看Boost libTR1smart pointers

此外,智能指针现在是称为C++11的C++标准的一部分。

票数 41
EN

Stack Overflow用户

发布于 2008-09-16 22:38:08

我完全赞同所有关于RAII和智能指针的建议,但我还想添加一个更高级别的提示:最容易管理的内存是您从未分配过的内存。与C#和Java这样的语言不同,在C++中,只要有可能,就应该将对象放在堆栈上。正如我看到的一些人(包括Dr.Stroustrup)指出的那样,垃圾收集在C++中从未流行的主要原因是,编写良好的C++从一开始就不会产生太多垃圾。

不要写

代码语言:javascript
复制
Object* x = new Object;

甚至是

代码语言:javascript
复制
shared_ptr<Object> x(new Object);

当你可以只写

代码语言:javascript
复制
Object x;
票数 202
EN

Stack Overflow用户

发布于 2008-09-16 20:42:45

您将需要查看智能指针,例如boost's smart pointers

而不是

代码语言:javascript
复制
int main()
{ 
    Object* obj = new Object();
    //...
    delete obj;
}

一旦引用计数为零,boost::shared_ptr将自动删除:

代码语言:javascript
复制
int main()
{
    boost::shared_ptr<Object> obj(new Object());
    //...
    // destructor destroys when reference count is zero
}

请注意我的上一个注释,“当引用计数为零时,这是最酷的部分。因此,如果你的对象有多个用户,你就不必跟踪该对象是否仍在使用。一旦没有人引用你的共享指针,它就会被销毁。”

然而,这并不是万能的。虽然你可以访问基指针,但除非你对它所做的事情有信心,否则你不会想把它传递给第三方API。很多时候,在创建作用域完成后,您的“发布”内容会被发送到其他线程,以便完成工作。这在Win32中的PostThreadMessage中很常见:

代码语言:javascript
复制
void foo()
{
   boost::shared_ptr<Object> obj(new Object()); 

   // Simplified here
   PostThreadMessage(...., (LPARAM)ob.get());
   // Destructor destroys! pointer sent to PostThreadMessage is invalid! Zohnoes!
}

像往常一样,使用任何工具来使用你的思维上限。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/76796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档