c ++ & quot; новый & quot; сравнение ключевых слов с Java

Прежде всего, я надеюсь, что это не дубликат. Я программист на Java и сейчас меняю на c ++.
В Java вы можете сделать это

 Object obj = new Object();

и, насколько я понимаю, вы можете сделать то же самое в c ++ (видя, как obj в java будет сохраняться только в переменной как ссылка), например так:

Object* obj = new Object();

Мой вопрос таков: как долго этот объект живет? он живет так же, как и указатель? Кроме того, это возможно сделать будет элемент initilazion объекта? И если так, будет ли объект жить до тех пор, пока указатель сохраняется как член vairable (до тех пор, пока тот объект, в котором он хранится, не будет уничтожен)?

Извините за любые опечатки. Хорошего дня / ночи!

0

Решение

Объект живет, пока кто-то не звонит delete на указатель, который указывает на это. Вы не должны использовать new а также delete если вы не реализуете какую-либо библиотечную функциональность там, где нет другого варианта, и вы действительно знаю, что ты делаешь. Действие по умолчанию должно быть не использовать new непосредственно, если это не инициализировать умный указатель или вставить в некоторый класс, который заботится об управлении памятью для вас.

Это был бы способ создания созданного по умолчанию экземпляра C ++. Object:

Object obj; // calls the default constructor
6

Другие решения

Как долго этот объект живет?

Пока вы явно delete Это. В отличие от Java, объекты в C ++, которые создаются динамически через new имеют контролируемые пользователем времена жизни и не собирают мусор, поэтому они не освобождаются автоматически при исчезновении всех ссылок на них. Если вы хотите такое поведение, есть классы, такие как std::auto_ptr а также std::unique_ptr справиться с этим для вас.

2

Вы создаете объект, подобный этому.

В файле .h у вас есть следующий Object * foo;

В классе .cpp вы инициализируете класс, подобный Java.

foo = new Object ();

Затем вы удаляете его с помощью ключевого слова delete — поэтому в этом случае удалите foo.

Я в похожей на тебя лодке. Я настоятельно рекомендую вам разобраться с указателями (* вещь) — это действительно мощно.

Редактировать: как сказано выше, вы также можете просто сделать Object foo, чтобы создать объект в стеке, а не в куче.

1

В C или C ++ он будет жить, пока не будет удален. Обычно вы хотите обернуть любое распределение / освобождение ресурсов (которое может включать вызовы new / delete и malloc / free) в пару ctor dtor. например

class ObjectManager
{
public:
ObjectManager()
: mObjectPtr(0)
{
mObjectPtr = new Object();
}

~ObjectManager()
{
delete mObject;
}
private:
Object* mObjectPtr;
};

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

0

В C ++ нет гарантированного сборщика мусора, поэтому он будет работать до тех пор, пока не будет явно удален.

Если вы хотите использовать указатели и хотите что-то более управляемое, вы можете использовать умный указатель

std::unique_ptr<Object> Obj = new Object();

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

Что касается инициализации члена, часть вашего вопроса вы можете сделать

TestMe()
{
Object Obj();

//Do something with object

}

Затем Obj создается в стеке и автоматически уничтожается, когда выходит из области видимости.

0
По вопросам рекламы [email protected]