Прежде всего, я надеюсь, что это не дубликат. Я программист на Java и сейчас меняю на c ++.
В Java вы можете сделать это
Object obj = new Object();
и, насколько я понимаю, вы можете сделать то же самое в c ++ (видя, как obj в java будет сохраняться только в переменной как ссылка), например так:
Object* obj = new Object();
Мой вопрос таков: как долго этот объект живет? он живет так же, как и указатель? Кроме того, это возможно сделать будет элемент initilazion объекта? И если так, будет ли объект жить до тех пор, пока указатель сохраняется как член vairable (до тех пор, пока тот объект, в котором он хранится, не будет уничтожен)?
Извините за любые опечатки. Хорошего дня / ночи!
Объект живет, пока кто-то не звонит delete
на указатель, который указывает на это. Вы не должны использовать new
а также delete
если вы не реализуете какую-либо библиотечную функциональность там, где нет другого варианта, и вы действительно знаю, что ты делаешь. Действие по умолчанию должно быть не использовать new
непосредственно, если это не инициализировать умный указатель или вставить в некоторый класс, который заботится об управлении памятью для вас.
Это был бы способ создания созданного по умолчанию экземпляра C ++. Object
:
Object obj; // calls the default constructor
Как долго этот объект живет?
Пока вы явно delete
Это. В отличие от Java, объекты в C ++, которые создаются динамически через new
имеют контролируемые пользователем времена жизни и не собирают мусор, поэтому они не освобождаются автоматически при исчезновении всех ссылок на них. Если вы хотите такое поведение, есть классы, такие как std::auto_ptr
а также std::unique_ptr
справиться с этим для вас.
Вы создаете объект, подобный этому.
В файле .h у вас есть следующий Object * foo;
В классе .cpp вы инициализируете класс, подобный Java.
foo = new Object ();
Затем вы удаляете его с помощью ключевого слова delete — поэтому в этом случае удалите foo.
Я в похожей на тебя лодке. Я настоятельно рекомендую вам разобраться с указателями (* вещь) — это действительно мощно.
Редактировать: как сказано выше, вы также можете просто сделать Object foo, чтобы создать объект в стеке, а не в куче.
В C или C ++ он будет жить, пока не будет удален. Обычно вы хотите обернуть любое распределение / освобождение ресурсов (которое может включать вызовы new / delete и malloc / free) в пару ctor dtor. например
class ObjectManager
{
public:
ObjectManager()
: mObjectPtr(0)
{
mObjectPtr = new Object();
}
~ObjectManager()
{
delete mObject;
}
private:
Object* mObjectPtr;
};
Если вы используете это, вы должны добавить некоторую обработку ошибок на случай, если что-то пойдет не так в новом.
В C ++ нет гарантированного сборщика мусора, поэтому он будет работать до тех пор, пока не будет явно удален.
Если вы хотите использовать указатели и хотите что-то более управляемое, вы можете использовать умный указатель
std::unique_ptr<Object> Obj = new Object();
Существует несколько различных типов интеллектуальных указателей, согласно связанному ответу, но в основном интеллектуальный указатель автоматически уничтожит объект, как только он выйдет из области видимости.
Что касается инициализации члена, часть вашего вопроса вы можете сделать
TestMe()
{
Object Obj();
//Do something with object
}
Затем Obj создается в стеке и автоматически уничтожается, когда выходит из области видимости.