我有一些代码向我投掷'生产'。我运行了一个内存泄漏检查程序,并在下面的'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];
}
以下是声明数组映射的方法:
struct SomeStruct{
int mapSizeX;
int mapSizeY;
std::list<BasisIndex>** arrayMap;
};
以下是它的几个用法:
someStruct->arrayMap[xVal][yVal].push_back(tempIndex);
for(it = someStruct->arrayMap[xVal][yVal].begin(); it != someStruct->arrayMap[xVal][yVal].end(); it++){
...
}
内存泄漏检查程序在我杀死之前倾倒了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;
如何完全删除与此阵列图关联的内存?
答案 0 :(得分:3)
按照您分配对象的相反顺序解除分配对象。
分配:
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;
答案 1 :(得分:3)
someStruct->arrayMap[x][y].~list();
&lt; - 您不应手动调用析构函数。 (我甚至不知道当首次使用新的放置时,这样做是有效的...)你需要使用delete
代替。