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:你读了我链接的问题/答案了吗?好的,谢谢大家,三法则是解决问题的一种方法,现在可以了!好的,非常感谢大家,三法则是解决问题的一种方法,现在可以了!