【问题标题】:deleting a vector of pointers vs. object in c++在c ++中删除指针向量与对象
【发布时间】:2011-06-10 15:13:12
【问题描述】:

我有一个指向一个对象的指针向量(我将它们作为指针,因为我会在很多地方淹没位置,我想只交换指针会快得多,而不是交换整个对象。

无论如何,我最终需要删除向量,但它指向的对象仍然需要有效。文档似乎说它将在向量中的每个对象上调用析构函数。当它是一个对象数组时这是有道理的,但是如果数组是一个指向对象的指针数组,那么指针指向的对象也会被删除,还是我需要手动删除它们?

如果它们被自动删除,保留对象的唯一方法(比如它们被用于不同的向量中)是将对象实际复制到另一个位置,并让向量中的指针指向这些对象(而不是原件)?

谢谢。

【问题讨论】:

标签: c++ pointers vector


【解决方案1】:

指针 值上调用析构函数什么都不做。 (另一方面,对指针值调用delete 会运行指向对象的析构函数,释放内存。)

在指向对象的指针数组的情况下,如果您想要的话,您必须手动释放对象。

【讨论】:

  • 谢谢。我将此标记为答案,因为它提供了最好的解释。 (反正到目前为止)
【解决方案2】:

如果你有一个指针向量,如果你删除(或清除)这个向量,实际的对象应该仍然存在。

【讨论】:

    【解决方案3】:

    您可以在向量中使用智能指针,例如Boost shared_ptr

    【讨论】:

    • 其实,听起来普通的香草指针正是他想要的。
    • @T.E.D.:是的,我想我是倒着读了这个问题。 8v) 尽管如此,使用shared_ptr 可能不是一个坏主意,如果它用于所有使用对象的东西。
    • 嗯……这些看起来很有趣。感谢您引起我的注意。
    【解决方案4】:

    它确实会破坏容器中的任何对象。但是,由于容器中的所有对象都是指针,因此不会有什么作用。

    阅读您的问题,这听起来正是您想要的,所以您很好。

    【讨论】:

      【解决方案5】:

      没关系 - 这就是 delete 关键字的原因。如果超出范围,则调用对象的析构函数。如果指针超出范围,则往往是内存泄漏。这同样适用于这里,所以你不必做任何特别的事情。

      它们将继续存在。

      【讨论】:

        【解决方案6】:

        无论如何,我最终需要删除向量,但它指向的对象仍然需要有效。文档似乎说它将在向量中的每个对象上调用析构函数。当它是一个对象数组时这是有道理的,但是如果数组是一个指向对象的指针数组,指针指向的对象也会被删除,还是我需要手动删除它们?

        首先,请阅读:http://crazyeddiecpp.blogspot.com/2010/12/pet-peeve.html

        现在问问自己,文档是否说 vector 删除了它包含的每个对象指向的每个对象?

        如果您可以用“否”回答这个问题,那么您就可以了。

        如果您可以用“是”来回答这个问题...嗯...尝试不同的文档。

        【讨论】:

          猜你喜欢
          • 2011-05-02
          • 2014-04-28
          • 1970-01-01
          • 2023-03-26
          • 2011-10-01
          • 2011-02-11
          • 2015-08-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多