Есть ли у примитивных типов в C ++ деструкторы? - PullRequest
2 голосов
/ 31 января 2020

Этот вопрос возник из-за того, что я пытался понять мотивацию для умных указателей, когда вы создаете класс-оболочку вокруг указателя, чтобы вы могли добавить собственный деструктор. Разве у указателей (и int, bools, double, et c.) Нет деструктора?

Ответы [ 4 ]

4 голосов
/ 31 января 2020

Технически говоря, неклассовые типы (термин C ++ для того, что часто называют «примитивным типом» в словах непрофессионала) не имеют деструкторов.

Стандарт C ++ говорит только о реальных деструкторах в контексте классов, см. [ class.dtor] в стандарте C ++. Кроме того, C ++ также позволяет вызывать деструктор для объекта, не относящегося к классу, с использованием той же записи, т.е. допустим следующий код:

void foo(int z) {
    using T = int;
    z.~T();
}

Это называется «псевдо-деструктор» и существует исключительно для разрешения написание шаблонного кода generi c для одинаковой работы с классами и не классами. Этот звонок вообще ничего не делает. Этот синтаксис определен в [expr.prim.id] в стандарте C ++.

4 голосов
/ 31 января 2020

Примитивные типы (и их соединения) имеют тривиальные деструкторы . Они ничего не делают и имеют специальную формулировку, которая позволяет их вообще пропустить в некоторых случаях.

Это, однако, ортогонально тому, почему в C ++ есть умные указатели. Необработанный указатель не принадлежит: он указывает на другой объект, но не влияет на его время жизни. Умные указатели, с другой стороны, владеют (или совместно владеют) своим указателем, привязывая его время жизни к своему собственному. Это то, что реализовано внутри, среди других специальных функций, их деструктора.

0 голосов
/ 31 января 2020

Деструкторы используются для освобождения ресурсов, которые мог использовать объект.

Для указателей вам не нужно удалять, если вы не выделяете новую память из кучи.

* У 1016 * и C ++ есть два способа хранения переменной: стек и куча.

Стек предназначен для стати c памяти, и компилятор позаботится об этом. Куча предназначена для динамической памяти c, и вы должны позаботиться об этом, если используете ее.

Когда вы делаете объявления примитивных типов, стековая память выделяется для переменных.

Когда вы используете new для объявления объекта, этот объект сохраняется в куче, которую необходимо удалить, когда вы заканчиваете использовать его, иначе это будет утечка памяти.

По сути, вы только нужно delete если ты что-то новое.

0 голосов
/ 31 января 2020

Нет, у указателей нет деструкторов. Объект, на который ссылается простой старый указатель, должен быть delete d, чтобы избежать утечек памяти, и тогда вызывается деструктор объекта, но компилятор не будет вызывать delete автоматически, даже когда указатель выходит из области видимости - что если другая часть вашей программы также имеет указатель на тот же объект?

Умные указатели не предназначены для вызова пользовательского деструктора, они должны обеспечить автоматическую очистку всего, когда они go вышли из объем. Эта «очистка» может быть удалением принадлежащих объектов, free в любой malloc редактируемой памяти, закрытием файлов, снятием блокировок и т. Д. c.

...