使用列表列表时发生内存泄漏

问题描述

| 我向我的“ 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];
}
这是声明数组映射的方式:
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;
如何完全删除与此数组映射关联的内存?     

解决方法

        按照与分配对象相反的顺序取消分配对象。 分配:
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[x][y].~list();
<-您不应手动调用析构函数。 (我什至不知道在不首先使用new放置位置的情况下这样做是有效的。)您需要改用
delete
。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...