【问题标题】:Using std::List with object pointers将 std::List 与对象指针一起使用
【发布时间】:2013-12-30 14:37:46
【问题描述】:

我正在编写一个四叉树,它将指向可碰撞对象的指针存储在 stl 列表中。 我希望四叉树能够根据对象在世界中的位置将对象从一个节点移动到另一个节点,并且希望得到一些确认:

如果我从列表中删除指针,将对象插入另一个树节点(例如父树节点),是否会调用指向对象的析构函数?为了澄清起见,我不希望对象被破坏,因为它在程序的其他地方使用和管理。

谢谢,提前。

【问题讨论】:

    标签: c++ list pointers stl


    【解决方案1】:

    列表中的实际对象(即指针)将被破坏,但不会破坏指针指向的对象。

    一开始可能会有点混乱,但如果您将指针及其指向的内容视为完全独立的实体,那就更有意义了。

    【讨论】:

    • 谢谢,我希望是这样。我的担心是徒劳的。 :-)
    【解决方案2】:

    对象的销毁由其存储时间决定。如果一个对象具有自动存储持续时间(如局部变量),它将在超出范围时被销毁。如果一个对象是动态分配的(使用new),它只会在你对它执行delete 时被销毁。如果是静态存储时长,程序结束时销毁。

    如果你只是将指针从一个节点复制到另一个节点,只要它指向的对象没有根据上述规则被销毁,指针将继续指向同一个有效对象。

    【讨论】:

      【解决方案3】:

      不,在 STL 中从不对指针调用析构函数。仅当您在指向的对象上显式调用 delete 时(或者如果存储在堆栈中的对象超出范围)或使用智能指针,它才会被销毁。

      【讨论】:

      • 这不太对。首先,当你delete它时被销毁的不是指针;它是它指向的对象。其次,指针指向的对象可以不使用delete而被销毁。考虑int* p; { int x = 0; p = &x; }
      • 我不明白这会如何破坏一个对象。我对那行代码的理解是,创建了一个未初始化的指针(p),然后将其设置为指向 x,其值为 0。我错了吗?
      • @Ian 它将被销毁,因为 x 驻留在堆栈上,而不是堆上。当它超出范围时,它将被销毁。
      • 啊,是的,我现在明白了,感谢您澄清这一点。我有点尴尬,我错过了......
      • 感谢您指出关于堆栈分配的不清楚的答案和遗漏点。
      【解决方案4】:

      我不确定你所说的是否会发生,但无论如何,在删除实例之前将指针重置为 NULL 可能是一个好习惯。另外,请记住使指向对象指向正确的节点,这可能是指向您删除的节点的节点。

      【讨论】:

      • 对不起,我觉得这个答案有点混乱。您的意思是在删除之前将列表节点设置为 null 吗?
      • 对不起,我的英语不好:s 我的意思是在擦除包含它的对象之前将指针设置为 null。无论如何,我认为没有必要考虑其他人所说的话。
      猜你喜欢
      • 2021-06-25
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多