新的和删除的经验法则

时间:2012-12-03 05:09:58

标签: c++

我想知道newdelete的经验法则是什么。 我一直认为,每次拨打new时,我都应该delete

在下面的情况中,如果我包含destructor,我会变坏 多余的错误。如果我不包含destructor,我的代码工作正常。

struct Foo
 {
     Foo(int A, int B)
     {
          bar = new std::vector< std::vector < int > >(A, std::vector<int>(B,2);
          //creates a vector of A vectors where each nested vector contains the number 2 B times. 
     }

     ~Foo() //Get bad access error if destructor included in code. 
     {
          delete[] bar;
     }     

     std::vector< std::vector < int > > *bar;
 };

int main()
{
    Foo X;

    return 0;
}

3 个答案:

答案 0 :(得分:8)

应该是delete bar;而不是delete [] bar;

将另一条规则添加到规则列表中。

  

只有当新行有[某个数字]

时,删除行才应该有[]

在您的情况下,new行没有[some number]

 bar = new std::vector< std::vector < int > >(A, std::vector<int>(B,2);

所以你的删除行也不应该有。

答案 1 :(得分:6)

上面的类可能写得更好:

struct Foo   
 {
     Foo(int A, int B)
       :  bar(A, std::vector<int>(B,2)) //creates a vector of A vectors where each nested vector contains the number 2 B times. 
     {}
     // Default copy
     // Default destructor.

     std::vector< std::vector < int > > bar;
 };

这可以避免明确的newdelete;通常是正确使用它们的最佳rule of thumb

答案 2 :(得分:0)

对于像c ++这样的非托管代码,经验法则是您的设计所需的任何内容。

一般来说,清理对象以避免内存泄漏是一个好主意,但是你可能会遇到想要在内存中保留内容的情况。