2013-10-21 49 views
1

stdlib的free()函数不适用于stl变量。 有没有一种常见的方式来释放由stl(像矢量,地图,集等)举起的空间?释放stl所占用的空间

+0

你没有(在大多数情况下) – P0W

+0

您是否在寻找类似的'delete'运算符(如果您的STL容器分配在堆上)? –

+0

@POW所以C++有自动垃圾收集? – ishan3243

回答

1

STL对象自动处理自己的释放。当一个STL对象超出作用域时,它的析构函数将被运行,这将实现必要的释放。正如FrédéricHamidi在评论中指出的那样,如果在堆上分配,您应该自己释放对象。在C++中建议使用new/delete而不是C的malloc/free组合。

+1

除非它通过'new'运算符被分配在堆上。 –

+1

@FrédéricHamidi:免费店铺* –

+0

@光,免费商店是正确的术语,是的,我站在更正:) –

1

free是一个C函数,不调用析构函数;因此,它在C++中几乎总是错误的。 delete在C++中是等效的。

尽管如此,你应该在这里做什么取决于你的意思是“STL变量”。如果你的意思是C++标准库对象,那么你去分配他们以同样的方式使用C你去分配任何对象++:

  1. 如果没有手动内存管理对象,无能为力 ;

    int main() 
    { 
        std::vector<int> v{0,1,2}; 
    } 
    
  2. 如果手动与new创建它的内存管理的对象,你可以使用delete;

    int main() 
    { 
        std::vector<int>* ptr = new std::vector<int>(); 
        ptr->push_back(0); 
        ptr->push_back(1); 
        ptr->push_back(2); 
        delete(ptr); 
    } // (PLEASE don't do this) 
    
  3. 如果手动内存管理由在阵列中与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) 
    

然而,在情况2和3,你应该真正使用了智能指针代替,如std::unique_ptrstd::shared_ptr;手动内存管理是不好

你不应该尝试手动内存管理C++标准库容器内的任何元素,容器拥有这些和意志已经免费了需要记忆:

int main() 
{ 
    std::vector<int> v{0,1,2}; 
    delete &v[0]; 
} // (So, so wrong) 
+0

Downvoted事实。太好了! –

+1

我对你最后一句话感到困惑。如果你做了一个新的,你做一个删除。为什么“不这样做”的评论?我敢肯定,当你需要在STL数据结构上创建指针时,有很多情况... – Kaidjin

+0

可能表明应该避免手动管理。 – Basilevs