Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用列表列表时内存泄漏_C++_Memory Leaks_Stdlist - Fatal编程技术网

C++ 使用列表列表时内存泄漏

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

有人向我抛出了一些“productionize”的代码。我运行了一个内存泄漏检查程序,它在下面的“for”循环中将下面的一行作为内存泄漏调用

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。不必按相反的顺序分配。我知道我们彼此误解了。=)