【问题标题】:Vector:clear/pop_back won't run destructorVector:clear/pop_back 不会运行析构函数
【发布时间】:2012-05-28 14:17:20
【问题描述】:

我有一个“Pictureframe”的向量(pflist),我想销毁它们。所以我运行 pflist.clear();文档说这会运行向量中每个项目的析构函数,但事实并非如此!

我有一个:

vector<Pictureframe*> pflist;

剩下的就是:

class Pictureframe{
    scene::IMeshSceneNode *picture;
    scene::IMeshSceneNode *frame;

public:
    Pictureframe();
    ~Pictureframe();
};

然后在cpp文件中:

Pictureframe::~Pictureframe(){
//  delete picture;
//  delete frame;
    cout<<"Destructor Called.\n\n";
}

看不到“被调用的析构函数”!这就是我所说的:

pflist.clear();

我确定这条线正在运行,并且由 5 个相框填充。我还尝试了一个通过向量 pop_back'ing 的 for 循环,并且遇到了同样的问题。

所以析构函数,Y U NO CALL?

【问题讨论】:

  • 你确定没有PictureFrame*的向量吗?
  • 你的向量是什么类型的?是vector&lt;Pictureframe&gt; 还是vector&lt;Pictureframe *&gt;
  • 我会调整问题

标签: c++ vector destructor irrlicht


【解决方案1】:

我很确定你有一个std::vector&lt;Pictureframe *&gt;
任何标准库容器都不负责清除动态分配的指针元素。

您必须遍历 std::vector 并在每个元素上调用 delete

我对一个老问题的回答应该是一个很好的阅读:
Does vector::erase() destroy the removed object?

【讨论】:

    【解决方案2】:

    您的问题没有说明std::vector 的类型是什么。如果类型为std::vector&lt;Pictureframe *&gt;,则调用std::vector::clear 时不会调用每个元素的析构函数。在这种情况下,您有责任在清除矢量之前delete这些对象。

    如果您不需要动态分配这些对象,请将向量类型更改为std::vector&lt;Pictureframe&gt;。将其用作:

    std::vector<Pictureframe> vec;
    vec.push_back( Pictureframe( ... ) );
    // do stuff
    vec.clear();
    

    现在将调用每个对象的析构函数。请记住为Pictureframe 创建一个复制构造函数和赋值运算符,因为看起来该类正在管理一些资源。

    如果必须动态分配Pictureframe对象,请将向量改为

    std::vector<std::unique_ptr<Pictureframe>> vec;
    vec.push_back( std::unique_ptr<Pictureframe>( new Pictureframe( ... ) ) );
    // do stuff
    vec.clear();
    

    unique_ptr 在这种情况下会自动delete 对象。

    其他选择是boost::shared_ptr,而不是std::unique_ptrboost::ptr_vector

    【讨论】:

    • 非常感谢您对这个答案的彻底性,您是正确的,并且它已修复! Muchos Gracias Senor
    • 更准确地说,容器中每个元素的析构函数都会运行。然而,指针的析构函数是无操作的。
    猜你喜欢
    • 2014-06-10
    • 2012-04-30
    • 2011-10-26
    • 2022-08-19
    • 2018-02-27
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多