我有以下代码:
customObject* object;
std::list<customObject> objects;
for(int i = 0; i < 10: ++i) {
object = new customObject;
object.getvalue(i);
objects.push_back(*object);
}
成功退出后会释放内存吗?
对不起,伙计们。犯了一些错误))修复
答案 0 :(得分:3)
因为您已将std::list
声明为:
std::list<customObject> objects; //not storing the pointers!
然后您无需使用customObject
创建new
。你应该这样做:
std::list<customObject> objects;
for(int i = 0; i < 10; ++i) {
customObject object;
object.getvalue(i);
objects.push_back(object); //store the object, not pointer!
}
在C ++ 0x中,这可以用lambda表达式非常简洁地完成,如:
std::list<customObject> objects(10);
int i=0;
std::for_each(objects.begin(),objects.end(),[&](customObject &obj){
obj.getValue(i++);
});
答案 1 :(得分:2)
首先你的代码不会编译(在指针上使用operator。,将列表推入自身)。第二个标准容器将释放它们分配的空间,但不会释放您使用new,malloc等分配的空间。
答案 2 :(得分:2)
修复语法错误并实际编译并运行您的代码(假设您保留在new
中),您将泄漏10 {{1 }}秒。
您必须遍历customObject
和list
每个delete
'的实例。
考虑您的new
是否需要来包含指针......如果确实如此,请考虑使用智能指针(但不是list
)。
最好只存储对象本身(std::auto_ptr
执行)。
答案 3 :(得分:1)
首先,std :: list的类型与您尝试存储在其中的对象之间存在不匹配。
std::list<customObject> objects;
这将创建一个customObjects列表而不是customObject指针。
std::list<customObject*> objects;
这将创建一个customObject指针列表。
一旦列表超出范围,是否释放内存;请注意,该列表将调用每个元素的析构函数。如果你认为指针(不管是什么类型)实际上只是内存地址的整数表示,而不是具有析构函数的对象;应该清楚的是列表没有析构函数来调用。另一种思考方式是所有stl容器都使用值语义,而不是解引用指针。
答案 4 :(得分:0)
不,内存不会被“释放”。 STL实践了值语义,容器认为它只“拥有”指针的“值”,而不是引用的对象。
答案 5 :(得分:0)
答案是否......我也不确定你的代码是否可行,因为你试图将指针存储在非指针列表中。
答案 6 :(得分:0)
操作系统将释放内存,但只有在程序退出后才能释放。
如果要在程序运行时释放内存,则需要在存储的每个指针上调用delete。或者使用Boost指针容器库自动释放指针。另一种解决方案是使用std::vector< std::shared_pointer<Item> >
。
答案 7 :(得分:0)
否强>
STL容器不释放分配给指针的内存,因为它们不知道它们是否拥有唯一的所有权,因此有责任释放内存。
答案 8 :(得分:0)
不要忘记你遇到的语法错误:通过指针访问成员并将指针推送到std::list
。至于你的问题:
这取决于。出于所有实际原因是:任何现代操作系统都会在您的流程结束时占用为流程分配的内存。
也就是说,随着流程的运行,流程负责释放不再需要的内存。在上面的代码中,在循环的每次迭代中都会引入 leak ,因为您永远不会释放在前一次迭代中分配的内存。这可能转化为系统范围的减速,并且在某些时候操作系统可能会因为粗鲁而终止您的流程。