0

我想知道经验法则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;
}
4

3 回答 3

8

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

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

仅当新行具有 [某个数字] 时,删除行才应具有 []

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

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

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

于 2012-12-03T05:11:10.273 回答
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;
 };

这避免了显式new的 and delete; 通常是rule of thumb正确使用它们的最佳选择!

于 2012-12-03T05:20:57.287 回答
0

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

通常,清理对象以避免内存泄漏是一个好主意,但您可能会遇到希望将某些内容保留在内存中的情况。

于 2012-12-03T05:14:09.470 回答