Вопрос по управлению памятью c ++ - PullRequest
1 голос
/ 29 апреля 2010

вместо

int *i = new int;
...
delete i;

Могу я просто сделать это?

int i;
...
delete &i;

Ответы [ 9 ]

10 голосов
/ 29 апреля 2010

Ты не хочешь этого делать. Объявленный в стеке int будет очищен, когда код выходит из области видимости.

5 голосов
/ 29 апреля 2010

Просто сделай:

int i;

i = 5 + 5;
4 голосов
/ 29 апреля 2010

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

Если вы выделяете пространство из кучи, вы должны явно освободить это пространство.

Вы не можете смешать эти две стратегии.

2 голосов
/ 29 апреля 2010

Нет. На самом деле НЕТ! Вы можете использовать delete только для освобождения памяти, выделенной new. Если вы вызовете delete для указателя на локальную переменную или для указателя на память, выделенную malloc(), ваша программа, скорее всего, вылетит.

Кроме того, убедитесь, что понимаете разницу между delete и delete [].

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

2 голосов
/ 29 апреля 2010

Вы должны динамически размещать переменные, только если вам нужно их в куче .

Распространенным заблуждением (или привычкой) людей, которые программируют на других языках, таких как Java, является использование оператора new для создания каждой переменной. Это не обязательно и может привести к фрагментации в вашем коде.

В C ++ для небольших переменных просто объявите их:
int i;
вместо:
int * i = new int;
Не объявляя их с помощью оператора new, вы позволяете компилятору автоматически удалять их при необходимости (например, при выходе из области видимости). Это избавляет программиста от бремени выделения и освобождения.

2 голосов
/ 29 апреля 2010

Краткий ответ: нет

Длинный ответ:

int i;

объявляет int в стеке. Этот int будет удален, когда int выйдет из области видимости.

int *i = new int;

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

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

Не делай этого

int i; 
...
delete &i;

Но если вам действительно нужно выделить int в куче и вы абсолютно хотите, чтобы ваша переменная выглядела как обычная переменная int, вы можете попробовать это:

int &i = *(new int); 
...
delete &i;
0 голосов
/ 29 апреля 2010

Если вы хотите разместить его в стеке, сделайте следующее:

int i;
i=5;

int будет удален, когда стек выйдет из области видимости (например, когда вы выйдете из функции).

Если вы хотите разместить его в куче, сделайте следующее:

int* i = new int; 
*i = 5;
delete i;

Это создаст указатель на int в куче. Удалите его, когда он вам больше не нужен.

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

Просто сделай

int i;

После закрывающей скобки для блока кода, в котором объявлено целое число, оно все равно будет удалено из стека.

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