函数退出时是否需要清除函数内部声明的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::map
或 std::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 本身之前调用这些对象的析构函数。
如果STLmap
是在函数内部局部声明的,是否需要在函数退出前清空映射?如果不清除,会不会造成内存泄漏?
Does STL 'map' declared locally inside a function need to be cleared when the function exits?
不,标准库容器的析构函数*负责清理它们自己的资源。否则它们将无法使用。
* STL也是一样,不过我相信你指的是C++标准库
没有。标准容器在销毁前不需要清除,因为资源会自动释放。
但是请注意,如果您的 std::map
或 std::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 本身之前调用这些对象的析构函数。