Я собираюсь дать этому фирму "очень возможно".
Одна из форм утечки памяти - это когда функция выделяет память и не удаляет ее хотя бы в одном пути из функции.Какой-то видовой указатель, такой как auto_ptr
, может справиться с этим очень хорошо(Примечание: auto_ptr
был частью первого стандарта ISO, и в следующем он устарел, поэтому сложно дать совет относительно того, какой указатель на область применения использовать. Обратитесь к документации компилятора и библиотеки, чтобы узнать, что они поддерживают.)
Другая форма - это то, где объект распределяется, а право собственности распределяется, а это означает, что существует более одной подпрограммы, которая использует его, и нет простого способа определить, все ли с ним справились.Это хороший кандидат на shared_ptr
, но вы должны проявить осторожность.Присвойте shared_ptr
при создании объекта и убедитесь, что при любом другом использовании указателя используется shared_ptr
.Если подпрограммы A, B и C обращаются к объекту через shared_ptr
, а вы не изменили D, то когда подпрограммы A, B и C завершены, он исчезает, независимо от потребностей D.
Одна вещь, которую вы хотите избежать с помощью shared_ptr
, это циклы, поскольку, если у меня есть shared_ptr
до J, у J есть shared_ptr
до K, а у K есть shared_ptr
для I, ни один из них не являетсякогда-либо будет удален, даже если он недоступен из других мест программы.Вам нужно следить за этими ситуациями.Вы можете разбить их на weak_ptr
в цикле, или удалить элемент в цикле самостоятельно, или просто жить с утечкой.
Еще одна вещь, которую следует учитывать, - это замена vector
и подобных контейнеров для динамическираспределенные массивы и другие динамически распределенные структуры данных.Это дает вам много управления памятью бесплатно, хотя вы все еще можете утечь память.Если вектор становится большим, а затем становится маленьким, он не освободит дополнительную память.Обычная практика, если вам действительно нужно восстановить память, это swap
когда-то большой вектор с его копией.
Короче говоря, есть много очень полезных инструментов для автоматизации большого количества памятиуправление, но они не заменяют мышление с вашей стороны.Многие проблемы можно решить, просто превратив каждый указатель в shared_ptr
и каждый массив в vector
, но разумное их использование даст еще большие преимущества.