C++ 释放stl占用的空间
stdlib的free()函数对stl变量不起作用。C++ 释放stl占用的空间,c++,stl,C++,Stl,stdlib的free()函数对stl变量不起作用。 是否有一种常见的方法来释放stl(如向量、贴图、集合等)占用的空间?stl对象自动处理它们自己的释放。当STL对象超出范围时,将运行其析构函数,该析构函数执行必要的释放。正如Frédéric Hamidi在评论中指出的,在堆上进行分配的情况下,您应该自己解除分配对象。在C++中,最好使用新的/DELL,而不是C的MalC/C组合。 < P> Fabue/Cuff>是C函数,不调用析构函数;这样,在C++中几乎总是错误的。代码>删除是C++中
是否有一种常见的方法来释放stl(如向量、贴图、集合等)占用的空间?stl对象自动处理它们自己的释放。当STL对象超出范围时,将运行其析构函数,该析构函数执行必要的释放。正如Frédéric Hamidi在评论中指出的,在堆上进行分配的情况下,您应该自己解除分配对象。在C++中,最好使用新的/DELL,而不是C的MalC/C组合。 < P> <代码> Fabue/Cuff>是C函数,不调用析构函数;这样,在C++中几乎总是错误的。代码>删除<代码>是C++中的等价项。 不过,这里应该做什么取决于“STL变量”的含义。如果你是C++标准库对象,那么你就用和你在C++中分配任何对象的方式去分配它们:
int main()
{
std::vector<int> v{0,1,2};
}
new[]
创建对象来手动管理对象的内存,请使用delete[]
int main()
{
std::vector<int>* ptr = new std::vector<int>[1];
ptr[0].push_back(0);
ptr[0].push_back(1);
ptr[0].push_back(2);
delete[](ptr);
} // (PLEASE don't do this either)
您可以使用自己的分配器以自己的方式管理容器中的对象
一些分配器已经准备好使用了(看看boost::pool)常见的方法是让它们在声明它们的作用域结束时消亡。没有垃圾收集本身,因为没有垃圾(如果你足够努力,你可以创建垃圾)。@ishan3243,没有,但是大多数时候STL容器是在自动存储(堆栈)上分配的,并在其封闭范围结束时释放。通常,你不需要这样做。他们会自己清理干净。他们被分配到你分配他们的任何地方,就像其他任何东西一样。它们持有的数据可以在“堆”上分配,但您不必取消分配。@molbdnilo:实际上,
free(0)
“工作”非常完美。:)当然,除非它是通过new
操作符在堆上分配的。@FrédéricHamidi:Free store*@Light,Free store是正确的术语,是的,我站着更正:)我对你的最后一句话感到困惑。如果执行新操作,则执行删除操作。为什么会有“不要这样做”的评论?我确信在很多情况下,当您需要在STL数据结构上创建指针时……可能是为了表明应该避免手动管理。@Kaidjin:如果您想这样做,请使用智能指针,例如std::unique_ptr
或std::shared_ptr
。2013年,我们不再做新增
和删除
了!
int main()
{
std::vector<int>* ptr = new std::vector<int>[1];
ptr[0].push_back(0);
ptr[0].push_back(1);
ptr[0].push_back(2);
delete[](ptr);
} // (PLEASE don't do this either)
int main()
{
std::vector<int> v{0,1,2};
delete &v[0];
} // (So, so wrong)