愚蠢的问题

时间:2011-05-13 12:20:10

标签: c++ memory-management stl

我有以下代码:

customObject* object;
std::list<customObject> objects;
for(int i = 0; i < 10: ++i) {
   object = new customObject;
   object.getvalue(i);
   objects.push_back(*object);
}

成功退出后会释放内存吗?

对不起,伙计们。犯了一些错误))修复

9 个答案:

答案 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 }}秒。

您必须遍历customObjectlist每个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 ,因为您永远不会释放在前一次迭代中分配的内存。这可能转化为系统范围的减速,并且在某些时候操作系统可能会因为粗鲁而终止您的流程。