【问题标题】:Remove classes of a STL::list<class something> which include a dynamic pointer删除包含动态指针的 STL::list<class something> 类
【发布时间】:2013-07-06 04:59:32
【问题描述】:

我有一个问题,但在任何地方都找不到答案。但是,我必须显示一些代码:

  #include "Vector2D"

    class something
    {
        Vector2D * p_Position;
      public:
        something(){p_Position = new Vector2D;}
        ~something(){delete p_Position;}
    };

    int main()
{
    std::list<something> Somethinglist;

    Somethinglist.push_back(something());

    Somethinglist.clear();
    return 0;
}

因此,当涉及到.clear() 函数时,这将导致断言失败。所以我尝试了一些东西。首先,如果我不将 delete p_Position 放入解构函数中,则此代码完全有效。这是为什么? STL列表.clear()函数会自动销毁动态指针吗?或者一个相当直接的问题:如何修复此代码?

【问题讨论】:

    标签: c++ list stl delete-operator


    【解决方案1】:

    std::list::push_back() 按值获取参数(即生成副本),这是一个真正的问题,因为您没有遵循 Rule of Three

    【讨论】:

    • 我一直在想,为什么这种语言没有设计成标准容器可以保存对添加到其中的对象的引用。 (我知道,由于它目前处于现状,这是不可能的,因为需要动态内存管理并且我们不能有指向引用的指针,但仍然......)
    • 所以基本上,我想做的事情是不可能的?
    • @TilmanZuckmantel:您阅读我链接的问题/答案了吗?
    【解决方案2】:

    首先,如果我只是不将删除 p_Position 放入解构函数中,则此代码完全可以工作。

    因为p_Position 如果你没有把它放在析构函数中,它就不会被释放。它会导致内存泄漏。

    为什么会这样。 STL list .clear() 函数是否会自动销毁动态指针?

    STL 容器保留原始对象的副本。当.clear()时,这些对象将被释放并调用它们的析构函数。

    或者一个相当直接的问题:我该如何修复这段代码?

    关注Rule of Three.

    或使用智能指针

    #include <memory>
    class something
    {
        std::unique_ptr<Vector2D> p_Position;
      public:
        something(){}
        ~something(){}
    };
    

    或者在没有指针的情况下使用它

    class something
    {
       Vector2D p_Position;
      public:
        something(){}
    };
    

    【讨论】:

    • 好的,非常感谢大家,三法则是解决问题的一种方法,现在可以了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2020-07-02
    • 2015-08-07
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多