Удалится ли объект из памяти после выполнения функции create()?
Object * obj;
void create() {
obj = new Object();
}
Или глобальным нужно делать сам объект, а не указатель на него?
Другие языки программирования и технологии
Создание объекта внутри функции C++
В С++ удаляются только локальные переменные (не динамические) . Все остальные - только по вашей команде.
Не путайте существование и видимость.
А также существование и инициализацию.
Всё что объявлено и определено - не удаляется, имеет свою область памяти.
Но оно не всем функциям должно быть видимо.
При входе в функцию обычно её локальные переменные инициализируются заново, просто по той причине, что функцию используют чаще с обнулением начальных значений (очисткой вспомогательных переменных) .
Когда надо некоторые значения хранить, их объявляют статическими, это переводит их в глобальную область видимости.
Экземпляр класса должен хранить свои свойства как объект настроенный, поэтому он существует как статический, пока его не удалят.
Функции-методы класса должны работать так, чтобы эти свойства в экземпляре сохранялись при повторном использовании этих методов.
Это поддерживается как концепцией класса, так и программистом, создающим методы. Методы принадлежат классу, но не экземпляру.
Пока указатель на объект существует, объект доступен из той области видимости, к которой принадлежит указатель на него. Объект превращается в мусор, занимающий память, если указатель потерян, затерт, удален.
А также существование и инициализацию.
Всё что объявлено и определено - не удаляется, имеет свою область памяти.
Но оно не всем функциям должно быть видимо.
При входе в функцию обычно её локальные переменные инициализируются заново, просто по той причине, что функцию используют чаще с обнулением начальных значений (очисткой вспомогательных переменных) .
Когда надо некоторые значения хранить, их объявляют статическими, это переводит их в глобальную область видимости.
Экземпляр класса должен хранить свои свойства как объект настроенный, поэтому он существует как статический, пока его не удалят.
Функции-методы класса должны работать так, чтобы эти свойства в экземпляре сохранялись при повторном использовании этих методов.
Это поддерживается как концепцией класса, так и программистом, создающим методы. Методы принадлежат классу, но не экземпляру.
Пока указатель на объект существует, объект доступен из той области видимости, к которой принадлежит указатель на него. Объект превращается в мусор, занимающий память, если указатель потерян, затерт, удален.
Простой ответ: то, что Вы создали через new удалится тогда, когда Вы вызовете delete
Сложный ответ: А Вам нужно, чтобы он удалился?
В C++ по синтаксису динамически созданные объекты удаляются ручками, а по правилам хорошего тона - умными указателями (умный указатель в деструкторе сам вызовет delete для исходного объекта, хотя тут тоже есть нюансы)
По-хорошему, ф-ция с названием create должна сама возвращать умный указатель, если только у Вас она не синглтон создает (синглтон - такой объект, который не более чем в единичном экземпляре для своего типа присутствует в программе)
На продвинутом уровне по Вашему вопросу: нужно читать инфу про std::auto_ptr (C++98), std::unique_ptr(C++11), std::shared_ptr(C++11), хотя бы по этим трем умным указателям. Желательно не полениться потратить недельку на их изучение. Существенная часть изучения C++ как раз сводится к тому, как правильно создавать и удалять объекты. Это нормально: -)
Сложный ответ: А Вам нужно, чтобы он удалился?
В C++ по синтаксису динамически созданные объекты удаляются ручками, а по правилам хорошего тона - умными указателями (умный указатель в деструкторе сам вызовет delete для исходного объекта, хотя тут тоже есть нюансы)
По-хорошему, ф-ция с названием create должна сама возвращать умный указатель, если только у Вас она не синглтон создает (синглтон - такой объект, который не более чем в единичном экземпляре для своего типа присутствует в программе)
На продвинутом уровне по Вашему вопросу: нужно читать инфу про std::auto_ptr (C++98), std::unique_ptr(C++11), std::shared_ptr(C++11), хотя бы по этим трем умным указателям. Желательно не полениться потратить недельку на их изучение. Существенная часть изучения C++ как раз сводится к тому, как правильно создавать и удалять объекты. Это нормально: -)
Похожие вопросы
- Возможно ли выполнить действие 1 раз внутри функции, вызываемой в бесконечном цикле, с помощью её аргумента?
- Что нужно знать для создания полноценного приложения на c++ ?
- Массив как аргумент функции C++
- Помогите пожалуйста переделать сей код под указатели и потом под функцию C++
- Что нужно изучать для создания технологий. Внутри:
- не могу вырезать в корел один векторный объект внутри другого. вырезается, но внешне не меняется. пустота закрашена!
- Вопрос для тех кто знает точный ответ, язык C про функции все подробности вопроса внутри...
- Функции в языке программирования C.
- C++ Указатели и функции.
- Как передать функцию в качестве параметра другой функции на C++?