新建和删除的经验法则

rule of thumb for new and delete

本文关键字:经验法则 删除 新建      更新时间:2023-10-16

我想知道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;
}

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

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

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

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

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

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

上面的类可能写成:

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

对于像

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

通常,清理

对象以避免内存泄漏是个好主意,但您可能会遇到想要在内存中保留某些内容的情况。