繁体   English   中英

stl + memory 管理问题

[英]stl + memory management question

例如,我有下一个代码:

#include <set>
using namespace std;

struct SomeStruct 
{
    int a;
};

int main ()
{
    set<SomeStruct *> *some_cont = new set<SomeStruct *>;
    set<SomeStruct *>::iterator it;
    SomeStruct *tmp;

    for (int i = 0 ; i < 1000; i ++)
    {
        tmp = new SomeStruct;
        tmp->a = i;
        some_cont->insert(tmp);
    }

    for (it = some_cont->begin(); it != some_cont->end(); it ++)
    {
        delete (*it);
    }

    some_cont->clear(); // <<<<THIS LINE
    delete some_cont;
    return 0;
}

在删除 some_cont 之前是否需要调用“这条线”以避免 memory 泄漏或将自动调用析构函数?

你不需要调用它,析构函数肯定会被调用。

不,在销毁它之前不需要清除它。

请注意,很少需要手动分配std::set (或任何标准容器)。 您最好将其放入自动存储并让 C++ 为您处理清理工作:

所以而不是

set<SomeStruct *> *some_cont = new set<SomeStruct *>;

利用

set<SomeStruct *> some_cont;

然后将所有some_cont->更改为some_cont. 并删除delete some_cont (容器将在main自动退出时被销毁。

这样做的好处是:

  1. 您不需要记住删除容器,并且
  2. 您无需预先进行昂贵的 memory 分配。

C++ 将东西放入自动存储中也更为惯用。

不,您不需要在销毁set之前明确清除set

OTOH,您确实有许多其他问题,从糟糕的(类似 Java 的)设计到不正确的语法,到缺少运算符,再到许多潜在的 memory 泄漏。 虽然某些设计在 Java 或 C# 中可能有意义,但在 C++ 中这是一个非常糟糕的主意。 一旦我们摆脱了最严重的问题,我们剩下的就是这样的:

#include <set>

struct SomeStruct 
{
    int a;
    SomeStruct(int i) : a(i) {}
    bool operator<(SomeStruct const &other) const { return a < other.a; }
};

int main ()
{
    std::set<SomeStruct> some_cont;

    for (int i = 0 ; i < 1000; i ++)
    {
        SomeStruct tmp(i);
        some_cont.insert(tmp);
    }
    return 0;
}

不,不是,这将在集合的析构函数中自动完成。

STL 容器会自动释放它们拥有的任何 memory。 因此,在您的情况下,分配给存储 SomeStruct* 的位置将由 set 的析构函数释放。 请注意,set 的析构函数不会调用 SomeStruct 的任何析构函数,因此最好迭代它们以自己删除它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM