【发布时间】:2013-12-30 14:37:46
【问题描述】:
我正在编写一个四叉树,它将指向可碰撞对象的指针存储在 stl 列表中。 我希望四叉树能够根据对象在世界中的位置将对象从一个节点移动到另一个节点,并且希望得到一些确认:
如果我从列表中删除指针,将对象插入另一个树节点(例如父树节点),是否会调用指向对象的析构函数?为了澄清起见,我不希望对象被破坏,因为它在程序的其他地方使用和管理。
谢谢,提前。
【问题讨论】:
我正在编写一个四叉树,它将指向可碰撞对象的指针存储在 stl 列表中。 我希望四叉树能够根据对象在世界中的位置将对象从一个节点移动到另一个节点,并且希望得到一些确认:
如果我从列表中删除指针,将对象插入另一个树节点(例如父树节点),是否会调用指向对象的析构函数?为了澄清起见,我不希望对象被破坏,因为它在程序的其他地方使用和管理。
谢谢,提前。
【问题讨论】:
列表中的实际对象(即指针)将被破坏,但不会破坏指针指向的对象。
一开始可能会有点混乱,但如果您将指针及其指向的内容视为完全独立的实体,那就更有意义了。
【讨论】:
对象的销毁由其存储时间决定。如果一个对象具有自动存储持续时间(如局部变量),它将在超出范围时被销毁。如果一个对象是动态分配的(使用new),它只会在你对它执行delete 时被销毁。如果是静态存储时长,程序结束时销毁。
如果你只是将指针从一个节点复制到另一个节点,只要它指向的对象没有根据上述规则被销毁,指针将继续指向同一个有效对象。
【讨论】:
不,在 STL 中从不对指针调用析构函数。仅当您在指向的对象上显式调用 delete 时(或者如果存储在堆栈中的对象超出范围)或使用智能指针,它才会被销毁。
【讨论】:
delete它时被销毁的不是指针;它是它指向的对象。其次,指针指向的对象可以不使用delete而被销毁。考虑int* p; { int x = 0; p = &x; }。
我不确定你所说的是否会发生,但无论如何,在删除实例之前将指针重置为 NULL 可能是一个好习惯。另外,请记住使指向对象指向正确的节点,这可能是指向您删除的节点的节点。
【讨论】: