多个构造函数的析构函数

Mar*_*ark 0 c++

我有两个C++构造函数和一个析构函数.当我为我的对象使用第一个构造函数时,析构函数被调用以删除A []这是我想要的,但是当我使用第二个构造函数时,我不需要调用析构函数,但C++编译器无论如何调用它会导致错误.解决这个问题的最佳方法是什么?

Tree(int n) {

  A = new int[n];
}

Tree(int data*, int n) {
   A = data;
}

~Tree(){

   delete [] A;
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 6

存储一个标志,指示析构函数是否应该调用delete.

请注意,在手动管理内存时,还需要用户定义的复制构造函数和复制赋值运算符.


Alo*_*ave 5

您需要使用C++ 03中的Rule of Three或C++ 11中的Rule of Five来避免此问题.

通常它是一个糟糕的设计,在这种情况下,只有这样才能区分你是否拥有动态分配的缓冲区的所有权是通过布尔标志成员,如果你是一个分配内存,你必须在构造函数中设置.然后在析构函数中删除之前,检查此标志并仅在设置了标志时解除分配.

Tree(int n) 
{

  A = new int[n];
  OwnFlag = true;
}

Tree(int data*, int n) 
{
   A = data;
   OwnFlag = false;
}

~Tree()
{
  if(OwnFlag)
      delete [] A;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码只是使用布尔标志的演示,您仍然需要遵循规则三.我已经发布了链接,这可以帮助你理解它是什么,我不在这里发布代码,因为我不希望你只是复制粘贴(我不会说如果我添加代码你会的,但你知道的只是如果).