Вам все еще нужно беспокоиться об освобождении памяти в C ++, просто есть лучшие методы / инструменты для этого. Можно утверждать, что внимание к управлению памятью в C ++ также сложнее из-за дополнительного требования написания безопасного кода исключений. Это делает такие вещи, как:
MyClass *y = new MyClass;
doSomething(y);
delete y;
Выглядите совершенно безобидно, пока не обнаружите, что doSomething()
выдает исключение, и теперь у вас есть утечка памяти. Это становится еще более опасным, поскольку код поддерживается, поскольку приведенный выше код мог бы быть безопасным до того, как кто-то изменил функцию doSomething()
в более позднем выпуске.
Следование методологии RAII является большой частью решения проблем управления памятью, а использование auto_ptr
или общих указателей, предоставляемых такими библиотеками, как Boost , упрощает включение этих методы в ваш код.
Обратите внимание, что auto_ptr
не является "общим" указателем. Это объект, который берет на себя ответственность за динамически размещенный объект и отдает это право собственности при назначении и копировании. Он не считает ссылки на память. Это делает его непригодным для использования в стандартных контейнерах, и многие в целом предпочитают shared_ptr Boost вместо auto_ptr, предоставляемого стандартом.
Никогда не безопасно помещать auto_ptrs в
стандартные контейнеры. Некоторые люди
скажу вам, что их компилятор и
библиотека компилирует это нормально и другие
скажу вам, что они видели
именно этот пример рекомендуется в
документация определенного популярного
компилятор; не слушай их.
Проблема в том, что auto_ptr не
вполне соответствует требованиям вида
Вы можете положить в контейнеры, потому что
копии auto_ptrs не являются
эквивалент. Во-первых, есть
ничего, что говорит вектор не может просто
принять решение и сделать "дополнительный"
внутренняя копия какого-то объекта это
содержит. Для другого, когда вы звоните
универсальные функции, которые будут копировать
элементы, как sort () делает,
функции должны быть в состоянии предположить,
что копии будут
эквивалент. По крайней мере, один популярный сорт
внутренне берет копию "опоры"
элемент, и если вы попытаетесь сделать это
работать на auto_ptrs будет весело
копия объекта pivot auto_ptr
(тем самым принимая на себя ответственность и положить
это во временном auto_ptr на
сторона), сделайте остальную часть своей работы на
последовательность (включая дальнейшее
копии теперь не владеющего auto_ptr
это было выбрано в качестве основного значения), и
когда сортировка закончена вокруг оси
уничтожен и у вас возникла проблема: при
хотя бы один auto_ptr в последовательности
(тот, который был опорным значением) нет
дольше владеет указателем, который он когда-то держал,
и на самом деле указатель он имел
уже был удален!
Взято из: Эффективно используя auto_ptr