【问题标题】:stupid stl question愚蠢的stl问题
【发布时间】:2011-08-24 21:42:19
【问题描述】:

我有以下代码:

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

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

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

【问题讨论】:

  • 也许你的意思是objects.push_back(*object);
  • 存在语法错误,其中一些与回答您的问题有关。
  • 是 customObject* 而不是 CustomObject* 是错字吗?
  • -1 @qutron 我认为你甚至不会尝试编译它。

标签: c++ memory-management stl


【解决方案1】:

既然您已将std::list 声明为:

std::list<customObject> objects; //not storing the pointers!

那么您不需要使用new 创建customObject。你应该这样做:

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++);
 });

【讨论】:

  • @Mihran:将: 替换为;。这是否决票的原因吗?
  • @Mihran:我没觉得这很有趣,因为错误与回答问题无关。虽然纠正它不是一个坏主意,但它不值得投反对票。
【解决方案2】:

一旦你修复了语法错误并真正编译运行你的代码(假设你保留在new中),你将泄漏十个customObjects。

您必须遍历 listdelete 您拥有 new'd 的每个实例。

考虑您的list 需要 是否包含指针...如果需要,则考虑使用智能指针(但不是std::auto_ptr)。

最好只存储对象本身(std::list&lt;customObject&gt; objects 这样做)。

【讨论】:

    【解决方案3】:

    首先,您的代码将无法编译(在指针上使用运算符 .,将列表推入自身)。第二个标准容器将释放它们分配的空间,但不会释放您使用 new、malloc 等分配的空间。

    【讨论】:

      【解决方案4】:

      首先,您在 std::list 的类型和您尝试存储在其中的对象之间存在不匹配。 std::list&lt;customObject&gt; objects; 这会创建一个 customObjects 列表,而不是 customObject 指针。 std::list&lt;customObject*&gt; objects; 这会创建一个 customObject 指针列表。

      关于一旦列表超出范围,内存是否会被释放;请注意,列表将调用每个元素的析构函数。如果您认为指针(无论类型如何)实际上只是内存地址的整数表示,而不是带有析构函数的对象;应该清楚该列表没有可调用的析构函数。另一种思考方式是所有 stl 容器都使用值语义并且从不取消引用指针。

      【讨论】:

        【解决方案5】:

        不,内存不会被“释放”。 STL实践值语义,容器认为它只“拥有”指针的“值”,而不是引用的对象。

        【讨论】:

          【解决方案6】:

          答案是否定的...我也不确定您的代码是否有效,因为您正试图将指针存储在非指针列表中。

          【讨论】:

            【解决方案7】:


            STL 容器不会释放分配给指针的内存,因为它们不知道自己是否拥有唯一的所有权,因此有责任释放内存。

            【讨论】:

              【解决方案8】:

              不要介意您遇到的语法错误:通过指针访问成员并将指针推送到std::list。至于你的问题:

              这取决于。出于所有实际原因:任何现代操作系统都会在您的进程结束时收回为您的进程分配的内存。

              也就是说,随着进程的运行,进程有责任释放它不再需要的内存。在上面的代码中,您在循环的每次迭代中引入了一个 leak,因为您永远不会释放在前一次迭代中分配的内存。这可能会导致整个系统的速度变慢,并且在某些时候操作系统可能会因为您的粗鲁而杀死您的进程。

              【讨论】:

                【解决方案9】:

                内存将被操作系统释放,但只有在程序退出后。

                如果您想在程序运行时释放内存,您需要在存储的每个指针上调用 delete。或者使用 Boost Pointer Container Library 自动释放指针。另一种解决方案是使用std::vector&lt; std::shared_pointer&lt;Item&gt; &gt;

                【讨论】:

                • 我不确定这是被问到的问题——因为一旦程序退出,所有分配器都会被释放。
                • @Martin Kristiansen:OP 已询问“成功退出时是否会释放内存?”。我把它解释为程序退出。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-07-11
                • 1970-01-01
                • 2011-06-09
                • 2011-01-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多