Re: Найти ошибку в конструкторе. Безопасность исключений.
От: Кодт Россия  
Дата: 24.10.08 17:48
Оценка:
Здравствуйте, czw, Вы писали:

czw>Задачка №4 из приложения E Страуструпа.

czw>Найдите ошибку в "messy" версии конструктора vector и напишите программу приводящую его к краху. Подсказка: сперва напишите деструктор вектора.

Существующий деструктор не уничтожает элементы, а просто убивает память из-под них.
Поэтому убийца уже выглядит так
struct A;
void subscribe(A*);
void unsubscribe(A*);
void notify_all(); // вызывает on_notify()

struct A
{
    A() { subscribe(this); }
    A(const A&) { subscribe(this); }
    ~A() { unsubscribe(this); }
    void on_notify();
};

int main()
{
    {
        vector<A> v(5);
        notify_all();
    }
    notify_all();
}


Так что нужно сделать
template<class T> void placement_delete(T* begin, T* end)
{
    while(begin!=end)
        (--end)->~T();
}

~vector()
{
    placement_delete(v, last-v);
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.