Запуск C ++ проекта. Стоит ли беспокоиться об освобождении динамически выделенной памяти? - PullRequest
4 голосов
/ 27 апреля 2010

Я довольно опытный в C, и освобождение памяти в C является обязательным.

Однако я начинаю свой первый проект на C ++ и слышал некоторые вещи о том, как вам не нужно освобождать память, используя общие указатели и другие вещи.

Где мне прочитать об этом? Является ли это ценной заменой правильной функциональности delete C ++? Как это работает?

EDIT

Я в замешательстве, некоторые люди говорят, что я должен выделить с помощью new и использовать умные указатели для процесса освобождения.

Другие люди говорят, что я не должен выделять динамическую память.

Другие говорят, что если я использую new , я также должен использовать delete , как C.

Так какой метод считается более стандартным и чаще используется?

Ответы [ 14 ]

1 голос
/ 27 апреля 2010

Освобождение памяти в C ++ так же необходимо, как и в C.

То, о чем вы можете подумать, - это библиотека умных указателей (среди прочего, стандартная библиотека auto_ptr), которая сделает подсчет ссылок за вас.

0 голосов
/ 03 июня 2010

В порядке предпочтения вы должны:

  1. Избегайте распределения ресурсов вообще. STL (стандартная библиотека шаблонов) C ++ поставляется с множеством контейнеров, которые обрабатывают выделение для вас. Используйте vector вместо динамически размещаемых массивов. Используйте string вместо char * для массивов символов. Попробуйте найти подходящий контейнер из STL, а не разрабатывать свой собственный.

  2. Если вы разрабатываете свой собственный класс и честно нуждаетесь в динамическом распределении (и, как правило, не будете создавать его с использованием членов STL), поместите все экземпляры new (new[]) в ваш конструктор и все экземпляры delete (delete[]) в вашем деструкторе. Вам вообще не нужно malloc и free.

  3. Если вы не можете сохранить распределение между конструкторами и деструкторами, используйте умные указатели. На самом деле это не так уж отличается от # 2; умные указатели - это просто специальные классы, которые используют деструкторы для обеспечения освобождения.

0 голосов
/ 27 апреля 2010

Прелесть C ++ в том, что вы имеете явный контроль над тем, когда что-то создается и когда оно уничтожается. Сделайте это правильно, и у вас не будет проблем с утечками памяти и т. Д.

В зависимости от вашей среды, вы можете создавать объекты в стеке или динамически размещать их (создавайте их в «куче» - куча в кавычках, потому что это перегруженный термин, но пока достаточно). 1003 *

Фу х; // создано в стеке - автоматически уничтожается при выходе программы из того блока кода, в котором она была создана.

Foo * y = новый Foo; // создано в куче - это О.К. чтобы передать это, так как вы контролируете, когда он уничтожен

Всякий раз, когда вы используете 'new', вы должны использовать соответствующую версию delete ... где-нибудь, как-нибудь. Если вы используете new для инициализации умного указателя, например:

std :: auto_ptr x = new Foo;

Вы на самом деле создаете два предмета. Экземпляр auto_ptr и экземпляр Foo. auto_ptr создается в стеке, Foo в куче.

Когда стек «раскручивается», он автоматически вызывает delete для этого экземпляра Foo. Автоматическая очистка для вас.

Итак, общее правило, используйте стековую версию, когда это возможно / практично. В большинстве случаев это также будет быстрее.

0 голосов
/ 27 апреля 2010

Я в замешательстве, некоторые люди говорят что я должен выделить, используя новые и используйте умные указатели для процесс освобождения.

Они правы. Как и в C, вам все равно нужно так или иначе управлять всей своей памятью. однако есть способы использовать язык для автоматизации удаления.

Умные указатели - это, в основном, локальные оболочки областей для указателей, которые используют объект .dtor для удаления соответствующего указателя, когда умный указатель - который, как и любой другой объект в стеке - выходит из области действия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...