C++:当我传递类指针时为什么调用Destructor?

C++:当我传递类指针时为什么调用Destructor?,c++,class,memory,pointers,destructor,C++,Class,Memory,Pointers,Destructor,析构函数只调用了5次,这是有意义的,因为创建了5个类。 当我只传递一个指针而不是一个类时,为什么在使用成员函数set_Link时调用析构函数。复制构造函数甚至没有被调用。谢谢你的帮助 这里有UB。析构函数被多次调用。删除[]标题;调用数组中每个对象的析构函数。析构函数依次通过delete Link;调用链接对象的析构函数 总的来说,析构函数被称为5+4+3+2+1=15次。主要是在已经被摧毁的物体上 通常,您不会为链表的元素创建数组。相反,创建如下列表: head[ii].set_Link(he

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

这里有UB。析构函数被多次调用。删除[]标题;调用数组中每个对象的析构函数。析构函数依次通过delete Link;调用链接对象的析构函数

总的来说,析构函数被称为5+4+3+2+1=15次。主要是在已经被摧毁的物体上

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

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

你在这里有一个小男孩。析构函数被多次调用。删除[]标题;调用数组中每个对象的析构函数。析构函数依次通过delete Link;调用链接对象的析构函数

总的来说,析构函数被称为5+4+3+2+1=15次。主要是在已经被摧毁的物体上

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

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

在链表节点析构函数中,不希望删除指向的下一个节点。这将级联删除所有尾部节点。您可以通过先将指针设置为NULL来防止它,但这只是一个可维护性的噩梦,它将创建许多类似这样的微妙错误


注意:为什么在我使用成员函数set_Link时调用析构函数?它不会被调用,通过添加两条额外的跟踪消息很容易验证这一点。所有析构函数调用都源自一个delete[]调用。

在链表节点析构函数中,您不想删除指向的下一个节点。这将级联删除所有尾部节点。您可以通过先将指针设置为NULL来防止它,但这只是一个可维护性的噩梦,它将创建许多类似这样的微妙错误


注意:为什么在我使用成员函数set_Link时调用析构函数?它不会被调用,通过添加两条额外的跟踪消息很容易验证这一点。所有析构函数调用都源自一个delete[]调用。

五个节点的完整数组是通过new创建的,这没关系。但是您传递给set_Link的指针指向这个内存块中的某个地方,因此当析构函数调用delete Link时,堆管理器不知道如何处理它们;b即使它知道,它们会被删除多次,因为你的五个对象会互相删除


注意:您只需要删除通过new获得的内容。

五个节点的完整数组是通过new创建的,这没关系。但是您传递给set_Link的指针指向这个内存块中的某个地方,因此当析构函数调用delete Link时,堆管理器不知道如何处理它们;b即使它知道,它们会被删除多次,因为你的五个对象会互相删除


请注意:您只需要删除通过new获得的内容。

为什么在使用成员函数set_Link时调用析构函数。-没有人给它打电话。您已经在执行一些跟踪消息,请再添加一些。我想知道你怎么没有注意到这一点。请发布一个完整但最小的程序来演示这种行为。否则,我们所能做的就是猜测,这对您没有帮助。请在您描述的任何一种情况下发布准确的输出。set_Data的代码是什么?为什么在使用成员函数set_Link时调用析构函数。-没有人给它打电话。您已经在执行一些跟踪消息,请再添加一些。我想知道你怎么没有注意到这一点。请发布一个完整但最小的程序来演示这种行为。否则,我们所能做的就是猜测,这对您没有帮助。请在您描述的任何一种情况下发布准确的输出。set_数据的代码是什么?谢谢,注意到删除,我从课本上读错了一些东西。你说得对,删除删除链接程序现在的行为更加可预测,析构函数现在只调用了5次。谢谢,注意到删除,我从课本上读错了一些东西。你说得对,删除删除链接程序现在的行为更加可预测,析构函数现在只调用了5次。谢谢。正如Karoly所建议的,我在删除链接之前添加了cout语句,消息的出现与您预测的析构函数将被调用一样。我不会猜到这种行为。我会记得,在创建新列表时,数组不适合初始化列表有什么特殊原因吗?@JimmyWong:当您需要在随机位置添加/删除节点时,您可以使用链表。如果元素存储在数组中,这就不那么容易了。@cojocar UB=undefined behavior,谢谢。我按照Karoly的建议在删除链接之前添加了cout语句,消息是o
正如你预测的,析构函数会被调用。我不会猜到这种行为。我会记得,在创建新列表时,数组不适合初始化列表有什么特殊原因吗?@JimmyWong:当您需要在随机位置添加/删除节点时,您可以使用链表。如果元素存储在数组中,这就不那么容易了。@cojocar UB=未定义的行为
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;