Другие языки программирования и технологии

Создание объекта внутри функции C++

Удалится ли объект из памяти после выполнения функции create()?

Object * obj;

void create() {
obj = new Object();
}

Или глобальным нужно делать сам объект, а не указатель на него?
Vladimir Malakhov
Vladimir Malakhov
150
В С++ удаляются только локальные переменные (не динамические) . Все остальные - только по вашей команде.
™ Aman ™ ™ Alimbekov ™
™ Aman ™ ™ Alimbekov ™
34 701
Лучший ответ
Не путайте существование и видимость.
А также существование и инициализацию.
Всё что объявлено и определено - не удаляется, имеет свою область памяти.
Но оно не всем функциям должно быть видимо.
При входе в функцию обычно её локальные переменные инициализируются заново, просто по той причине, что функцию используют чаще с обнулением начальных значений (очисткой вспомогательных переменных) .
Когда надо некоторые значения хранить, их объявляют статическими, это переводит их в глобальную область видимости.
Экземпляр класса должен хранить свои свойства как объект настроенный, поэтому он существует как статический, пока его не удалят.
Функции-методы класса должны работать так, чтобы эти свойства в экземпляре сохранялись при повторном использовании этих методов.
Это поддерживается как концепцией класса, так и программистом, создающим методы. Методы принадлежат классу, но не экземпляру.
Пока указатель на объект существует, объект доступен из той области видимости, к которой принадлежит указатель на него. Объект превращается в мусор, занимающий память, если указатель потерян, затерт, удален.
Простой ответ: то, что Вы создали через new удалится тогда, когда Вы вызовете delete

Сложный ответ: А Вам нужно, чтобы он удалился?
В C++ по синтаксису динамически созданные объекты удаляются ручками, а по правилам хорошего тона - умными указателями (умный указатель в деструкторе сам вызовет delete для исходного объекта, хотя тут тоже есть нюансы)

По-хорошему, ф-ция с названием create должна сама возвращать умный указатель, если только у Вас она не синглтон создает (синглтон - такой объект, который не более чем в единичном экземпляре для своего типа присутствует в программе)

На продвинутом уровне по Вашему вопросу: нужно читать инфу про std::auto_ptr (C++98), std::unique_ptr(C++11), std::shared_ptr(C++11), хотя бы по этим трем умным указателям. Желательно не полениться потратить недельку на их изучение. Существенная часть изучения C++ как раз сводится к тому, как правильно создавать и удалять объекты. Это нормально: -)
Denis Shuplik
Denis Shuplik
19 662