Объявление динамических операторов памяти C ++ - PullRequest
2 голосов
/ 26 ноября 2008

Привет, если я создаю что-то в стеке, используя new, я объявляю это как:

object *myObject = new object(contr, params);

Есть ли способ объявить это, например:

object *myObject;
myObject = new object(constr, params);

Это правильно?

Ответы [ 5 ]

10 голосов
/ 26 ноября 2008

Да, это правильно. Но new не создает вещи в стеке, он создает их в куче.

Чтобы создать объект в стеке, вы должны сделать:

object myObject(constr, params);

Нет другого способа создать объект в стеке, и как только он будет создан в стеке, вы не сможете «воссоздать» его с тем же именем позже в той же функции.

3 голосов
/ 26 ноября 2008

Как уже говорили другие, new создаст * myObject в куче. Для полноты я укажу, что указатель на объект, называемый myObject (заметьте, что нет *), находится в стеке так, как вы его объявили. Поскольку переменные стека выходят из области видимости, когда вы покидаете функцию, вы должны удалить объект перед возвратом или перенести указатель на другую переменную с более длительным временем жизни. Пренебрежение удалением объекта кучи, указатель которого находится в переменной стека перед возвратом из функции, является своего рода сценарием канонической утечки памяти (хотя и далеко не единственным)

2 голосов
/ 26 ноября 2008

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

object myObject(contr,params);
1 голос
/ 26 ноября 2008

Если вы хотите, чтобы объект находился в стеке, вам нужно сказать

object myObject(contr, params);
0 голосов
/ 26 ноября 2008

Этот код:

object *myObject;
myObject = new object(constr, params);

... законно и правильно. Но, пожалуйста, , пожалуйста, инициализируйте myObject, когда вы его выделяете. Помните, что «myObject» сам по себе не является экземпляром «объекта», но является экземпляром указателя на «объект». Поэтому, когда вы объявляете этот указатель так:

object *myObject;

... вы оставляете это неинициализированным. Вместо этого сделайте это:

object *myObject = 0;
myObject = new object(constr, params);

... а при удалении:

delete myObject;
myObject = 0;

Люди могут спорить, что вы должны установить для него значение NULL, а не 0, но с языком все в порядке, и это в основном вопрос стиля и того, к чему привыкли ваши коллеги.

...