Цель C: Распределение памяти в стеке или куче - PullRequest
22 голосов
/ 01 декабря 2010

Я несколько озадачен тем, когда вещи распределяются в куче (и мне нужно освободить их) и когда они распределяются в стеке (и мне не нужно освобождать их).

Есть ли эмпирическое правило?

Я думаю, что в C ++ практическое правило заключается в том, что если вы используете ключевое слово new, они находятся в куче.Какое правило с целью с?Как я могу определить, когда что-то расположено в стеке?

Будет ли эта строка кода размещена в стеке?

NSString *user = @"DEFAULT";

Ответы [ 4 ]

37 голосов
/ 01 декабря 2010

Objective-C в этом отношении прост.

Все объекты Objective-C всегда выделяются в куче.

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

Для:

NSString *user = @"DEFAULT";

Строковый объект технически не находится в куче, но вполне может быть.А именно, он генерируется компилятором и является частью двоичного файла вашего приложения.Его не нужно сохранять и освобождать, потому что класс (NSCFConstantString, IIRC) переопределяет retain / release / autorelease, чтобы эффективно ничего не делать.следует прочитать (и перечитать) Руководство по управлению памятью Objective-C .

(есть еще одно исключение, но это довольно эзотерическая деталь: блоки начинаются в стеке,может Block_copy () передать их в кучу. Блоки также являются объектами Objective-C, но это редко предоставляется при использовании.)

34 голосов
/ 01 декабря 2010

В Objective-C это просто: все объекты размещаются в куче.

Правило таково, если вы вызываете метод с alloc или new или copy в имени (или вы звоните retain), у вас есть этот объект, и вы должны освободить его в какой-то момент позже, когда закончите с ним.Было много написано на эту тему.

Пример, который вы приводите, является особым случаем: это статическая строка, я думаю, что она фактически находится в сегменте данных программы (в куче), но она статическаявам не нужно беспокоиться о его выпуске.

1 голос
/ 01 декабря 2010

В Objective-C нет стекового выделения объектов (блоки - это другой случай, в который я не буду здесь вдаваться)

NSString *user = @"DEFAULT";

Это выделяет объект NSConstantString в постоянной памяти, а не в стеке.

0 голосов
/ 15 августа 2017

В Objective-C (и многих других языках) объект - это просто непрерывный шарик памяти с определенным расположением. Объекты обычно создаются в куче. Хранилище для самой переменной указателя объекта находится в стеке но объект, на который он указывает, находится в куче.

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