Утечка памяти при использовании списка списков - PullRequest
0 голосов
/ 01 июня 2011

Мне бросили какой-то код для «производства».Я запустил средство проверки утечки памяти, и оно вызывает следующую строку в цикле '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;

Как полностью удалить памятьсвязанный с этим массивом карты?

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

someStruct->arrayMap[x][y].~list(); <- Вы не должны вызывать деструктор вручную. (Я даже не знал, что это правильно делать, когда новое размещение не использовалось первым ...) Вместо этого вам нужно использовать <code>delete.

3 голосов
/ 01 июня 2011

Выделите объекты в том порядке, в котором вы их разместили.

Распределение:

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];
}

Deallocation:

for (int i=0; i<someStruct->mapSizeX; i++){
    delete[] someStruct->arrayMap[i];
}
delete[] someStruct->arrayMap;
...