Есть примерно такой код Код (Text): class allocator { public: void *allocate(size_t); void deallocate(void*); ... }; class A { public: A(allocator *palloc) : m_palloc(palloc) , m_buf (0) {} void func (int n) { m_buf = m_palloc->allocate(n); } ~A() { if (m_buf) m_palloc->deallocate(m_buf); } private: allocator *m_palloc; char *m_buf; }; class Manager { Manager() : m_alloc () , a(&m_alloc) {} allocator m_alloc; A m_a; } int main () { Manager m; m->doSomething(); } И все бы ниче, только при деструкции класса Manager неизвестно в каком порядке вызываются деструкторы для m_alloc и m_a. И может так получиться что деструктор для m_a попытается воспользоваться уже уничтоженным m_palloc. Есть ли решение кроме как слежения за временем жизни объектов с помощью new/delete?
Почему не известен порядок? Насколько помню, Страуструп пишет: ...Можно, конечно, и в стандарт заглянуть...
деструкторы вызываются в обратном порядке от создания сначала создается allocator m_alloc; потом A m_a; уничтожаются наоборот во всех компиляторах одинаково
Плохо искал. Google -> c++ destructor order -> первая ссылка -> [11.11] When I write a destructor, do I need to explicitly call the destructors for my member objects? -> A class's destructor (whether or not you explicitly define one) automagically invokes the destructors for member objects. They are destroyed in the reverse order they appear within the declaration for the class.