C++ 使用列表列表时内存泄漏
有人向我抛出了一些“productionize”的代码。我运行了一个内存泄漏检查程序,它在下面的“for”循环中将下面的一行作为内存泄漏调用C++ 使用列表列表时内存泄漏,c++,memory-leaks,stdlist,C++,Memory Leaks,Stdlist,有人向我抛出了一些“productionize”的代码。我运行了一个内存泄漏检查程序,它在下面的“for”循环中将下面的一行作为内存泄漏调用 someStruct->arrayMap = new std::list<BasisIndex>*[someStruct->mapSizeX]; for(int i=0; i<someStruct->mapSizeX; i++){ someStruct->arrayMap[i] = new std::l
someStruct->arrayMap = new std::list<BasisIndex>*[someStruct->mapSizeX];
for(int i=0; i<someStruct->mapSizeX; i++){
someStruct->arrayMap[i] = new std::list<BasisIndex>[someStruct->mapSizeY];
}
内存泄漏检查程序在我杀死它之前转储了5分钟。然后,我在清理例程中添加了以下代码位,但它仍然会转储150条警告,所有警告都指向顶部for循环中的代码行
for(int x=0; x<someStruct->mapSizeX; x++){
for(int y=0; y<someStruct->mapSizeY; y++){
someStruct->arrayMap[x][y].clear();
someStruct->arrayMap[x][y].~list();
}
}
std::list<BasisIndex> ** temp = someStruct->arrayMap;
delete temp;
for(int x=0;xmapSizeX;x++){
for(int y=0;ymapSizeY;y++){
someStruct->arrayMap[x][y].clear();
someStruct->arrayMap[x][y]。~list();
}
}
std::list**temp=someStruct->arrayMap;
删除临时文件;
如何完全删除与此数组映射关联的内存?按与分配对象相反的顺序释放对象 分配:
someStruct->arrayMap = new std::list<BasisIndex>*[someStruct->mapSizeX];
for(int i=0; i<someStruct->mapSizeX; i++){
someStruct->arrayMap[i] = new std::list<BasisIndex>[someStruct->mapSizeY];
}
for (int i=0; i<someStruct->mapSizeX; i++){
delete[] someStruct->arrayMap[i];
}
delete[] someStruct->arrayMap;
someStruct->arrayMap=new std::list*[someStruct->mapSizeX];
对于(inti=0;imapSizeX;i++){
someStruct->arrayMap[i]=newstd::list[someStruct->mapSizeY];
}
解除分配:
someStruct->arrayMap = new std::list<BasisIndex>*[someStruct->mapSizeX];
for(int i=0; i<someStruct->mapSizeX; i++){
someStruct->arrayMap[i] = new std::list<BasisIndex>[someStruct->mapSizeY];
}
for (int i=0; i<someStruct->mapSizeX; i++){
delete[] someStruct->arrayMap[i];
}
delete[] someStruct->arrayMap;
for(int i=0;imapSizeX;i++){
删除[]someStruct->arrayMap[i];
}
删除[]someStruct->arrayMap;
按与分配对象相反的顺序释放对象
分配:
someStruct->arrayMap = new std::list<BasisIndex>*[someStruct->mapSizeX];
for(int i=0; i<someStruct->mapSizeX; i++){
someStruct->arrayMap[i] = new std::list<BasisIndex>[someStruct->mapSizeY];
}
for (int i=0; i<someStruct->mapSizeX; i++){
delete[] someStruct->arrayMap[i];
}
delete[] someStruct->arrayMap;
someStruct->arrayMap=new std::list*[someStruct->mapSizeX];
对于(inti=0;imapSizeX;i++){
someStruct->arrayMap[i]=newstd::list[someStruct->mapSizeY];
}
解除分配:
someStruct->arrayMap = new std::list<BasisIndex>*[someStruct->mapSizeX];
for(int i=0; i<someStruct->mapSizeX; i++){
someStruct->arrayMap[i] = new std::list<BasisIndex>[someStruct->mapSizeY];
}
for (int i=0; i<someStruct->mapSizeX; i++){
delete[] someStruct->arrayMap[i];
}
delete[] someStruct->arrayMap;
for(int i=0;imapSizeX;i++){
删除[]someStruct->arrayMap[i];
}
删除[]someStruct->arrayMap;
someStruct->arrayMap[x][y]。~list()代码>someStruct->arrayMap[x][y]。~list()代码>改用std::vector
。用new
分配STL容器非常糟糕。(我所说的恐怖是指杀死小狗的恐怖)@比利:事实上更糟。它在杀死小猫!我没有太多使用这些容器的经验。为什么这是一个如此糟糕的做法?这段代码需要尽可能快,但内存使用并没有那么重要。谢谢,因为没有理由动态分配它们。让它们成为自动变量。与容器无关,但通常是如何在C++中使用对象,句点。如果你在现代C++中一直在用指针来处理,那么会出现问题。这就是scoped_ptr
、unique_ptr
、shared_ptr
、auto_ptr
和朋友的目的。(当然,如果你使用的是一些总是不同的C API;))当你使用时,你可能会更喜欢使用std::vector
而不是std::list
。使用std::vector
。用new
分配STL容器非常糟糕。(我所说的恐怖是指杀死小狗的恐怖)@比利:事实上更糟。它在杀死小猫!我没有太多使用这些容器的经验。为什么这是一个如此糟糕的做法?这段代码需要尽可能快,但内存使用并没有那么重要。谢谢,因为没有理由动态分配它们。让它们成为自动变量。与容器无关,但通常是如何在C++中使用对象,句点。如果你在现代C++中一直在用指针来处理,那么会出现问题。这就是scoped_ptr
、unique_ptr
、shared_ptr
、auto_ptr
和朋友的目的。(当然,如果您使用的是一些总是不同的C API;))当您使用时,您可能会更喜欢使用std::vector
而不是std::list
。确实如此。如果你先删除[]someStruct->arrayMap[i]
,你将如何删除[]someStruct->arrayMap呢?是的,这很重要。但是,您可以按任何顺序核化someStruct->arrayMap[i]
s。不必按相反的顺序分配。我知道我们彼此误解了。=)当然有。如果你先删除[]someStruct->arrayMap[i]
,你将如何删除[]someStruct->arrayMap呢?是的,这很重要。但是,您可以按任何顺序核化someStruct->arrayMap[i]
s。不必按相反的顺序分配。我知道我们彼此误解了。=)