C++ 删除STL::list的类<;分类某物>;其中包括一个动态指针

C++ 删除STL::list的类<;分类某物>;其中包括一个动态指针,c++,list,stl,delete-operator,C++,List,Stl,Delete Operator,我有个问题,到处都找不到答案。但是,我必须展示一些代码: #include "Vector2D" class something { Vector2D * p_Position; public: something(){p_Position = new Vector2D;} ~something(){delete p_Position;} }; int main() { std::list

我有个问题,到处都找不到答案。但是,我必须展示一些代码:

  #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;
}
#包括“Vector2D”
分类
{
矢量2D*p_位置;
公众:
something(){p_Position=new Vector2D;}
~something(){delete p_Position;}
};
int main()
{
std::列出某物列表;
把某物往后推(某物());
Somethinglist.clear();
返回0;
}
因此,对于
.clear()
函数,这将导致断言失败。所以我尝试了一些方法。首先,如果我不把
delete p_位置
放在解构器中,这段代码就完全可以工作了。为什么呢?STL list
.clear()
函数是否会自动销毁动态指针?或者一个相当直接的问题:如何修复此代码?

std::list::push_-back()
按值获取其参数(即生成副本),这是一个真正的问题,因为您没有遵循。

std::list::push_-back()
按值获取其参数(即生成副本),这是一个真正的问题,因为你没有遵守规则

首先,如果我不把delete p_位置放在解构器中,那么这段代码完全可以工作

因为如果您没有将p_位置放入析构函数中,它将不会被释放。它会导致内存泄漏

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

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

或者是一个相当直接的问题:如何修复此代码

跟随

或使用智能指针

#include <memory>
class something
{
    std::unique_ptr<Vector2D> p_Position;
  public:
    something(){}
    ~something(){}
};
首先,如果我不把delete p_位置放在解构器中,那么这段代码完全可以工作

因为如果您没有将p_位置放入析构函数中,它将不会被释放。它会导致内存泄漏

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

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

或者是一个相当直接的问题:如何修复此代码

跟随

或使用智能指针

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

我总是想知道为什么语言的设计不能使std容器能够保存对添加到它们中的对象的引用。(我理解,就目前的情况而言,这是不可能的,因为需要动态内存管理,我们不能有指向引用的指针,但仍然…)基本上,我想做的是不可能的?@TilmanZuckmantel:你读过我链接到的问题/答案了吗?我总是想知道为什么语言的设计不能使std容器能够保存对添加到它们中的对象的引用。(我明白,就目前情况而言,这是不可能的,因为需要动态内存管理,我们不能有指向引用的指针,但仍然…)所以基本上,我想做的是不可能的?@TilmanZuckmantel:你读了我链接的问题/答案了吗?好的,谢谢大家,三法则是解决问题的一种方法,现在可以了!好的,非常感谢大家,三法则是解决问题的一种方法,现在可以了!