如果在函数内部声明了STL map
,是否需要在函数退出之前清除映射?如果没有清除,是否会导致内存泄漏?
答案 0 :(得分:6)
没有。在销毁之前不需要清除标准容器,因为资源会自动释放。
但请注意,如果您的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);
...
}
不会泄漏记忆。
这一切总结为;总是使用容器或智能指针;如果你真的需要,只使用原始指针指向的动态分配对象。
答案 1 :(得分:3)
STL&#39;映射&#39;当函数退出时,需要在函数内部声明吗?
不,标准库容器 * 的析构函数负责清理自己的资源。否则他们将无法使用。
*这同样适用于STL,但我相信你指的是C ++标准库
答案 2 :(得分:-1)
这取决于STL映射是在堆上还是在函数堆栈上创建的。 如果在堆上创建了STL映射,则需要将其删除。如果在堆栈上创建STL映射,则应在堆栈展开期间自动调用映射的析构函数。
另请注意,如果STL容器保存指针,则必须显式释放这些指针指向的内存。这里,STL的析构函数只释放分配用于保存指针的内存;但不是被保持指针指向的内存。
对于保存副本(对象或其他基本数据类型)的STL容器,在堆栈展开期间清理STL本身之前,STL析构函数应调用这些对象的析构函数。