c++: в чем разница между new Object() и Object()

поэтому в С++ вы можете создавать экземпляры объектов, используя ключевое слово new или иным образом...

Object o = new Object();

но вы также можете просто сделать

Object o = Object();

в чем именно разница между двумя и почему я должен использовать один над другим?


person kamikaze_pilot    schedule 25.04.2011    source источник
comment
Ты сможешь? Я получаю сообщение об ошибке: запрошено преобразование из «Объект*» в нескалярный тип «Объект».   -  person Josh Lee    schedule 25.04.2011
comment
Я не программист на C++, но считаю, что ключевое слово new выделяет память для объекта.   -  person Craige    schedule 25.04.2011
comment
Я считаю, что первая строка должна быть Object *o = new Object();   -  person mdec    schedule 25.04.2011
comment
возможный дубликат создания переменных в куче или стеке в C++   -  person Bo Persson    schedule 25.04.2011


Ответы (3)


Вы не можете сделать Object o = new Object(); Оператор new возвращает указатель на тип. Это должно быть Object* o = new Object(); Экземпляр Object будет находиться в куче.

Object o = Object() создаст экземпляр Object в стеке. Мой C++ заржавел, но я считаю, что, хотя это наивно выглядит как создание, за которым следует присваивание, на самом деле это будет просто вызов конструктора.

person QuantumMechanic    schedule 25.04.2011
comment
Object o; даст вам объект в стеке, используя конструктор без аргументов. Object o = Object(); делает то же самое. Обычно вторая форма используется для создания объекта в стеке, когда вы передаете аргументы конструктору; Object o = Object(x,y,x); - person Brian Roach; 25.04.2011
comment
Технически объект не обязательно должен находиться в стеке, это зависит от контекста, в котором он используется (т.е. он может быть членом динамически размещаемого объекта). Использование термина стек/куча очень похоже на Java и не имеет отношения к C++. Первая версия возвращает указатель на объект dynamic storage duration, вторая создает временный объект и присваивает его объекту automatic storage duration. - person Martin York; 25.04.2011
comment
Мой комментарий к приведенному выше стеку/куче операторов очень похож на Java и не имеет отношения к С++. Во встраиваемых системах пространство стека оптимизировано по скорости и эффективности использования памяти, но имеет меньший размер и обычно используется для стандартных типов. Куча больше, медленнее и обычно используется для определяемых пользователем типов (UDT). - person TheChrisONeil; 03.06.2014

Первый тип:

Object* o = new Object();

Создаст новый объект в куче и назначит адрес o. Это вызывает только конструктор по умолчанию. Когда закончите, вам придется вручную освободить память, связанную с объектом.

Второй тип:

Object o = Object();

Создаст объект в стеке, используя конструктор по умолчанию, затем вызовет конструктор присваивания на o. Большинство компиляторов исключают вызов присваивания, но если у вас есть (преднамеренные или иные) побочные эффекты в операции присваивания, вы должны принять это во внимание. Обычный способ создания нового объекта без вызова операции присваивания:

Object o; // Calls default constructor
person AK.    schedule 25.04.2011

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

Я заметил разницу в компиляторе Visual Studio 2015 и gcc v4.8.5.

class Object
{
public:
x=0;
void display(){ std::cout<<" value of x:   "<<x<<"\n";}
};

Object *o = new Object;
o->display(); // this gives garbage to this->x , uninit value in visualstudio compiler and //in linux gcc it inits this->x to 0

Object *o = new Object(); // works well
o->display();
person PeerPandit    schedule 09.11.2017