Частный деструктор - PullRequest
14 голосов
/ 07 февраля 2011

Почему я могу создать объект класса с приватным деструктором в бесплатном хранилище, но не в стеке?

Например, это недопустимо:

class Foo
{
public:
   explicit Foo( int );
   static void delete_foo(Foo* foo ) { delete foo; }
private:
   int x;
   ~Foo();
   Foo( const Foo& );
   Foo& operator=(const Foo& );
};

int main()
{
   Foo * fooptr = new Foo(5); // legal
   Foo::delete_foo( fooptr ); // legal 
   Foo foo(5); // illegal
}

Ответы [ 5 ]

18 голосов
/ 07 февраля 2011

Когда вы создаете его в стеке, он должен быть уничтожен, прежде чем функция сможет вернуться.Предполагая, что рассматриваемая функция не имеет доступа к деструктору, это недопустимо.

Когда вы создаете ее в бесплатном хранилище, она оставляется для другого кода, который имеет доступ к деструктору, для его уничтожения..

Функция-член класса с закрытым деструктором может создать экземпляр в стеке.Статическая функция-член может быть вызвана даже без существующего экземпляра.Хотя, вероятно, нет веской причины писать такую ​​вещь.

10 голосов
/ 07 февраля 2011

Поскольку объект с автоматическим хранением * должен быть, ну, в общем, автоматически уничтожен.Таким образом, деструктор должен быть доступен для вызова;если это не так, вы не можете иметь этот тип в автоматическом хранилище.

Наоборот, вы можете удалить его, когда вы выделяете его динамически.Вы, конечно, не можете этого сделать.

* Объекты здесь на «типичных» платформах обычно размещаются в стеке.

2 голосов
/ 07 февраля 2011

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

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

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

Если вы используете его в смарт-указателе, вы должны убедиться, что он удален, имеет доступ. Это может отличаться для разных интеллектуальных указателей, а для некоторых вы можете предоставить собственный деструктор, который может быть статическим членом класса.

2 голосов
/ 07 февраля 2011

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

0 голосов
/ 09 декабря 2015

Потому что тогда вы можете принудительно установить, что объект всегда выделяется динамически, т. Е. С новым оператором. Чтобы это работало, вам нужно реализовать метод dispose (), который вызывает «delete this» до его возврата. Это позволяет создавать методы завершения, которые вызываются до уничтожения объекта или части объекта, и поэтому могут безопасно удалять или отключать элементы экземпляра до вызова цепочки виртуальных деструкторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...