使用列表列表时内存泄漏

Memory leak in using a list of lists

本文关键字:列表 泄漏 内存      更新时间:2023-10-16

有人向我抛出了一些代码来"产品化"我运行了一个内存泄漏检查器,它调用下面"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();<--您不应该手动调用析构函数。(当没有先使用placement new时,我甚至不知道这样做是有效的…)你需要使用delete