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

Jim*_*ong 1 c++ memory pointers destructor class

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;
}
Run Code Online (Sandbox Code Playgroud)

我正在学习链接列表.我不明白为什么我的析构函数被调用15次,而cout语句被打印15次.如果我摆脱声明

head[ii].set_Link(head + (ii + 1));
Run Code Online (Sandbox Code Playgroud)

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

Hen*_*rik 8

你有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; 
Run Code Online (Sandbox Code Playgroud)