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