C++ 释放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++中

stdlib的free()函数对stl变量不起作用。
是否有一种常见的方法来释放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)