Serg89
@Serg89
Изучаю. Читаю.

Когда использовать указатели на объекты при объявлении в C++?

Начинаю изучать программирование на С++. Подскажите, пожалуйста, когда при объявлении объекта пользоваться :
Object obj();,
а когда
Object obj = new Object();
?
  • Вопрос задан
  • 432 просмотра
Решения вопроса 2
EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++
1. Способ это переменная создаваяемая на стеке.
2. Это переменная создаваемая в динамической памяти. Если конечно Вы или "Ваш друг" с оператором new ничего не сделали.

Динамическая память куда большего размера чем область стека
Ответ написан
Nipheris
@Nipheris Куратор тега C++
ОФФТОП:
1) Object obj(); - это объявление функции obj без параметров, возвращающей объект класса Object. Объявление объекта obj делается без скобок: Object obj; Да, такие синтаксические тонкости.
2) про звездочку вам уже сказали

ПО ДЕЛУ:
1) Object obj;
"компилятор-компилятор, создай-ка мне автоматическую переменную с объектом в текущей области видимости. За пределами этой области видимости она не нужна, так что можешь убить его сам, чтобы я не парился на этот счет". Компилятор и убьет, т.е. вызовет деструктор и освободит память, если уже пора.
2) Object* obj = new Object();
"компилятор-компилятор, создай-ка мне автоматическую переменную-указатель obj, а также ручную переменную с объектом, расположив ее в динамической памяти (вместо стека/статического сегмента в 1-м случае) и дай мне ее указатель, я его сохраню в obj. Я этот указатель потом буду далеко передавать, записывать в другие структуры и объекты, так что ты, компилятор, не парься, я сам потом попрошу уничтожить объект и освободить память, когда буду знать, что уже можно".

Плюс первого варианта - время жизни переменной и объекта в ней совпадает с областью видимости. Вам следить за временем ее жизни не нужно, но при этом вы не сможете работать с переменной, если она уйдет из области видимости (например, грубейшая ошибка новичка - возвращать из функции указатель на локальную переменную). Следовательно, таким образом сложно создавать и использовать "долгоживущие" объекты, вроде окон или подключений к БД.
Плюс второго варианта - вы создаете и убиваете объект абсолютно в любом месте программы, но компилятор умывает при этом руки - вы запросили память, вам ее и освобождать. В языках со сборщиком мусора это делает сложный алгоритм, который анализирует достижимость объектов в памяти из программы. В C/C++ за этим следит программист.

Но программист может себе упростить жизнь с помощью умных указателей, добавьте себе на заметку, почитаете позже, когда разберетесь с основами.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@vilgeforce
Раздолбай и программист
Только все-таки Object* obj = new, как мне кажется.
Использование new позволяет создавать сущности в процессе работы программы.
Ответ написан
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
При создании, а не при объявлении. Вам пока что всегда первый вариант (но без скобок). Разберетесь с языком -- поймёте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы