0

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

  #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()功能会自动销毁动态指针吗?或者一个相当直接的问题:如何修复此代码?

4

2 回答 2

5

std::list::push_back()按值取参数(即生成一个副本),这是一个真正的问题,因为您没有遵循“三法则”

于 2013-07-06T05:01:48.130 回答
1

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

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

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

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

或者一个相当直接的问题:我怎样才能修复这个代码?

遵循三法则

或使用智能指针

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

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

class something
{
   Vector2D p_Position;
  public:
    something(){}
};
于 2013-07-06T05:12:19.590 回答