C++ 为什么在传递类指针时调用析构函数?

标签 c++ class memory pointers destructor

int main(){
   //Node is some template class
   Node<int>* head = new Node<int>[5];

   for(int ii = 0; ii < 5; ii++)
   {
      head[ii].set_Data(ii);
      head[ii].set_Link(head + (ii + 1));
      if(ii == 4)
      {
        head[ii].set_Link(NULL);
      }
   }
   delete [] head;
 }


template<typename T>
void Node<T>::set_Link(Node* Node_Address)
{
    Link = Node_Address;
}


template<typename T>
Node<T>::~Node()
{
    delete Link;
    cout << "Destructor" << endl;
}

我现在正在学习链表。我不明白为什么我的析构函数被调用了 15 次并且 c​​out 语句被打印了 15 次。 如果我去掉语句

head[ii].set_Link(head + (ii + 1));

析构函数只被调用了 5 次,这是有道理的,因为创建了 5 个类。 为什么当我使用成员函数 set_Link() 时调用析构函数,当我只传递一个指针,而不是一个类时。甚至没有调用复制构造函数。感谢您的帮助!

最佳答案

你在这里有 UB。多次调用析构函数。 delete [] head; 调用数组中每个对象的析构函数。析构函数又通过delete Link;调用链接对象的析构函数。

析构函数总共被调用 5 + 4 + 3 + 2 + 1 = 15 次。主要针对已经销毁的对象。

通常,您不会为链表的元素创建数组。相反,像这样创建列表:

Node<int>* head = new Node<int>(); 
Node<int>* node = head;
for(int ii = 0; ii < 5; ii++) 
{ 
  node->set_Data(ii); 
  if(ii == 4) 
  { 
    node.set_Link(NULL); 
  }
  else
  {
    Node<int>* next = new Node<int>();
    node->set_Link(next);
    node = next;
  }
} 
delete head; 

关于C++ 为什么在传递类指针时调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11625267/

相关文章:

c++ - 将 _CrtDumpMemoryLeaks() 输出到字符串

c++ - 为什么使用delete会导致core dump?

c++ - 在 Windows 7 上连接到高于 10 的 COM 端口时出现无效句柄错误

php - 类中的文本方向不适用于 tr

python - 在 Python 中定义类变量的正确方法

Android 堆大小限制,我们真的还需要在设计应用程序时牢记 16 MB 的限制吗?

c++ - 有没有办法减少 ostringstream malloc/free 的?

c++ - 与不带dynamic_pointer_cast的智能指针复合

Java 基类引用变量

c# - Net Core中各种内存拷贝函数有什么区别?