фрагмент кода ниже:Как избежать утечек памяти, с C++ с контейнерами STL?
//container declared
map<string, structA*>& aMap;
// allocation and insertion to container
structA *item = new structA();
aMap["arrDevAddr"] = item;
Однако я итерацию и освободить значение карты (указатель) в конце карты привыкания.
Теперь, из-за вышеописанного фрагмента кода, valgrind отмечает меня как «определенно просочившийся» сообщение.
Я хочу пояснить, общий принцип кодирования, чтобы избежать утечки памяти. По моему пониманию, в (C++-кодировании):
- Когда мы выделяем память, мы также имеем право на ее освобождение, ограниченное общим диапазоном кода.
- Когда мы сохраняем выделенную память в каком-либо контейнере (например, здесь карту), нам все равно нужно сохранить эти указатели (распределения), пока карта не будет использовать эти указатели.
- что означает, выделить >> добавить указатель на контейнер >> использование указателей на карте >> обеспечить «удаление/освобождение» структур-указателей, когда использование карты закончено, или если карта содержится в каком-либо объекте , то в «деструкторе» объекта карта должна быть повторена, а структурные указатели должны быть освобождены.
исправьте меня, если я ошибаюсь в своем понимании.
ВТОРОЙ СЛУЧАЙ:
class A{
...
map<string, structA*>& aMap;
...
}
сейчас в каком-то другом классе, карта вставляется со значением, как;
if(..)
{ structA item;
aObj->aMap["arrDevAddr"] = &item;
}
...
Теперь, в этом случае, как «элемент» является локальным для области видимости, будет карта будет содержащей «висячие ссылки»? Если нет, то как? В таком сценарии, каким должен быть способ, мы избегаем утечек памяти во время кодирования?
Не управляйте памятью самостоятельно. Используйте смарт-указатель или контейнеры ptr Boost. – chris
Или хранить ценности, а не указатели на другие вещи. – juanchopanza
_ «Как избежать утечек памяти» _ Самый простой способ - просто не использовать 'new'! [Стандартная библиотека C++] (http://en.cppreference.com/w/cpp/memory) вооружает вас всем необходимым для этого. –