Здравствуйте, 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>>