STL'映射'当函数退出时,需要在函数内部声明吗?

时间:2015-03-27 07:14:19

标签: c++ dictionary stl

如果在函数内部声明了STL map,是否需要在函数退出之前清除映射?如果没有清除,是否会导致内存泄漏?

3 个答案:

答案 0 :(得分:6)

没有。在销毁之前不需要清除标准容器,因为资源会自动释放。

但请注意,如果您的std::mapstd::vector包含动态分配内存的原始指针,则必须注意此内存。

换句话说,破坏原始指针并不会释放指向的内存,因此代码如下:

void foo() {
    std::map<std::string, int *> mymap;
    mymap["mykey"] = new int[100];
    ...
}

不会泄漏密钥,但会泄漏动态分配的100个整数。

如果地图包含其他容器,那么一切都会好的;例如:

void foo() {
    std::map<std::string, std::vector<int> > mymap;
    mymap["mykey"].resize(100);
    ...
}

不会泄漏记忆。

这一切总结为;总是使用容器或智能指针;如果你真的需要,只使用原始指针指向的动态分配对象。

答案 1 :(得分:3)

  

STL&#39;映射&#39;当函数退出时,需要在函数内部声明吗?

不,标准库容器 * 的析构函数负责清理自己的资源。否则他们将无法使用。


*这同样适用于STL,但我相信你指的是C ++标准库

答案 2 :(得分:-1)

这取决于STL映射是在堆上还是在函数堆栈上创建的。 如果在堆上创建了STL映射,则需要将其删除。如果在堆栈上创建STL映射,则应在堆栈展开期间自动调用映射的析构函数。

另请注意,如果STL容器保存指针,则必须显式释放这些指针指向的内存。这里,STL的析构函数只释放分配用于保存指针的内存;但不是被保持指针指向的内存。

对于保存副本(对象或其他基本数据类型)的STL容器,在堆栈展开期间清理STL本身之前,STL析构函数应调用这些对象的析构函数。