[英]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
自动退出时被销毁。
这样做的好处是:
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.