函数退出时是否需要清除函数内部声明的STL 'map'?

Does STL 'map' declared locally inside a function need to be cleared when the function exits?

如果STLmap是在函数内部局部声明的,是否需要在函数退出前清空映射?如果不清除,会不会造成内存泄漏?

Does STL 'map' declared locally inside a function need to be cleared when the function exits?

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


* STL也是一样,不过我相信你指的是C++标准库

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

但是请注意,如果您的 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);
    ...
}

不会泄漏内存。

所有这些总结为;始终使用容器或智能指针;如果确实需要,只使用原始指针指向的动态分配对象。

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

另请注意,如果 STL 容器包含指针,则必须显式释放这些指针指向的内存。在这里,STL 的析构函数只会释放分配给指针的内存;但不是持有指针指向的内存。

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