Будет ли это бесплатно данные правильно?

Я просто хочу знать, правильно ли это освободит данные.

Псевдокод:

std::map<std::string, ClassPointer*>::iterator tempIterator;

for(tempIterator = directory.begin(); tempIterator < directory.end;
tempIterator++)
delete &tempIterator;

0

Решение

Поскольку каталог хранит необработанный указатель, вы обязаны удалить эти указатели, когда это необходимо.

std::map<std::string, ClassPointer*>::iterator tempIterator;

for(tempIterator = directory.begin(); tempIterator < directory.end();
tempIterator++)
{
delete tempIterator->second;
}

Всегда лучшее решение — использовать умный указатель в контейнерах STL:

 std::map<std::string, std::shared_ptr<ClassPointer>> directory;
4

Другие решения

Если ClassPointer* выделяется с new[]этот фрагмент кода может работать неправильно. Вместо этого лучше использовать умные указатели.

И к вашему сведению, это должно быть

for (auto tempIterator = directory.begin(); tempIterator != directory.end();
++tempIterator)
2

правильный путь:

for (
std::map<std::string, ClassPointer*>::iterator it = directory.begin()
, last = directory.end()     // avoid call to end() every time
; it != last                 // use operator != (NOT operator <)
; ++it                       // prefer prefix increment for iterators!
) delete it->second;         // iterator points to std::pair actually!

или C ++ 11 способом:

for (auto& item : directory) delete item.second;

и кстати, это только освободит указатель класса, а не элемент карты! (поэтому указатель на карте стал недействительным, но элемент остается на карте)

1
По вопросам рекламы [email protected]