如何确保在编写C++代码本身时不会导致任何内存泄漏?

ani*_*ish 6 c++ memory-leaks

运行valgrind或purify将是接下来的步骤但是在编写代码本身时,您如何确保它不会导致任何内存泄漏?您可以确保以下事项: - 1:新数量等于删除2:打开文件描述符是否关闭

还有别的事吗?

Gle*_*len 25

尽可能使用RAII习语

使用智能指针,例如std :: auto_ptr.(不要在任何标准集合中使用auto_prt,因为它不会像你想象的那样工作)

  • @orsogufo,我不喜欢绝对的陈述.如果我说"总是"某人可能会想出RAII不合适的情况(仅仅因为我没有想到这种情况并不意味着其他人没有). (2认同)

小智 14

尽量避免动态创建对象.来自Java和其他类似语言的程序员经常写下这样的东西:

string * s = new string( "hello world" );
Run Code Online (Sandbox Code Playgroud)

什么时候他们应该写:

string s = "hello world";
Run Code Online (Sandbox Code Playgroud)

类似地,当它们应该创建值集合时,它们会创建指针集合.例如,如果您有这样的类:

class Person {
   public:
      Person( const string & name ) : mName( name ) {}
      ...
   private:
      string mName;
};
Run Code Online (Sandbox Code Playgroud)

而不是编写如下代码:

vector <Person *> vp;
Run Code Online (Sandbox Code Playgroud)

甚至:

vector <shared_ptr <Person> > vp;
Run Code Online (Sandbox Code Playgroud)

而是使用值:

vector <Person> vp;
Run Code Online (Sandbox Code Playgroud)

您可以轻松添加到这样的矢量:

vp.push_back( Person( "neil butterworth" ) );
Run Code Online (Sandbox Code Playgroud)

并且为您管理Person和vector的所有内存.当然,如果你需要一组多态类型,你应该使用(智能)指针

  • 这使得实际上不可能使用多态,使得传递数据变得困难,并且可能导致膨胀.不考虑它,不要批量申请这个建议. (2认同)

Aam*_*mir 7

使用智能指针

  • 是的,第二个建议应该是"聪明的自己":) (2认同)
  • 使用boost :: weak_ptr <>来解析参考图中的循环. (2认同)

Bin*_*ier 5

  1. 使用RAII
  2. 隐藏默认复制ctors,operator =()in EVERY CLASS,除非a)你的类很简单,只使用原生类型,你知道它总是如此b)你明确定义自己的

在1)RAII,想法是自动删除,如果你发现自己在想"我刚刚打电话给新的,我需要记得在某处调用删除"然后你做错了.删除应该是a)自动或b)放入dtor(以及哪个dtor应该是显而易见的).

2)隐藏默认值.识别流氓默认拷贝ctors等可能是一场噩梦,最简单的方法是通过隐藏它们来避免它们.如果你有一个通用的"root"对象,所有东西都是继承的(无论如何都可以方便调试/分析)隐藏默认值,然后当某个东西试图分配/复制一个继承类时,编译器barfs因为ctor等不是在基类上可用.

  • boost :: noncopyable对#2非常方便 (2认同)