воскресенье, 28 августа 2005 г.

Порядок разрушения

Рассмотрим следующий код:
#include<list>
#include<algorithm>

class window_t;
std::list list;
class window_t {
public:
window_t() {
list.push_back(this);
}
~window_t() {
list.erase(std::find(list.begin(), list.end(), this);
}
} window;
Данный код по замыслу автора должен выполнять следующее: создать контейнер(список) для хранения указателей на ВСЕ объекты класса window_t. Для того чтобы поддерживать актуальность информации из данного списка, конструктор и деструктор класса настроены так, что как только создаётся новый объект, информация о нём попадает в контейнер, а как только объект уничтожается ссылка на него удаляется. Думаю ничего важного я не упустил при толковании.

Вроде бы всё правельно и должно работать. А теперь вопрос: что произойдёт когда программа будет завершать свою работу? Если контейнер будет уничтожен до объектов, при попытке уничтожения объектов может произойти выход за пространство адресации.

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

(Перенесено из ЖЖ)

Комментариев нет: