Как я могу контролировать порядок уничтожения объектов кучи? - PullRequest
3 голосов
/ 04 февраля 2010

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

Я предполагаю, что платформа может иметь значение в этом: Visual Studio 2005 Professional, Visual C ++. Все было построено с cl.

Ответы [ 3 ]

5 голосов
/ 04 февраля 2010

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

С другой стороны, если вы назначаете их статическим интеллектуальным указателям и если они находятся в одной и той же единице перевода, то первый созданный будет последним уничтоженным:

static std::auto_ptr <AType> a( new AType );  // destroyed second
static std::auto_ptr <BType> b( new BType );  // destroyed first

И давайте не будем придираться к статическому устареванию: -)

4 голосов
/ 04 февраля 2010

Вы можете зарегистрировать удаление ваших синглетонов в atexit , что означает LIFO.

1 голос
/ 04 февраля 2010

Краткий ответ: Да

Длинный ответ:
Прочитайте это: Поиск проблем порядка статической инициализации C ++

Резюме:

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

Чтобы убедиться, что B уничтожен до A, тогда B должен быть создан до A. Чтобы сделать это, просто заставьте конструктор A получить экземпляр B.

См. Здесь: Шаблон проектирования C ++ Singleton для множества ссылок об одиночных кнопках.

...