как вызывать деструкторы для членов класса в определенном порядке?

Тема в разделе "LANGS.C", создана пользователем letopisec, 5 янв 2011.

  1. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    Есть примерно такой код

    Код (Text):
    1. class allocator
    2. {
    3. public:
    4.     void *allocate(size_t);
    5.     void deallocate(void*);
    6.     ...
    7. };
    8.  
    9. class A
    10. {
    11. public:
    12.     A(allocator *palloc)
    13.     : m_palloc(palloc)
    14.     , m_buf (0)
    15.     {}
    16.    
    17.     void func (int n)
    18.     {
    19.         m_buf = m_palloc->allocate(n);
    20.     }
    21.  
    22.     ~A()
    23.     {
    24.          if (m_buf) m_palloc->deallocate(m_buf);
    25.     }
    26.  
    27. private:
    28.     allocator *m_palloc;
    29.     char *m_buf;
    30. };
    31.  
    32.  
    33. class Manager
    34. {
    35.     Manager()
    36.     : m_alloc ()
    37.     , a(&m_alloc)
    38.     {}
    39.  
    40.     allocator m_alloc;
    41.     A m_a;
    42. }
    43.  
    44. int main ()
    45. {
    46.     Manager m;
    47.     m->doSomething();
    48. }
    И все бы ниче, только при деструкции класса Manager неизвестно в каком порядке вызываются деструкторы для m_alloc и m_a.
    И может так получиться что деструктор для m_a попытается воспользоваться уже уничтоженным m_palloc.

    Есть ли решение кроме как слежения за временем жизни объектов с помощью new/delete?
     
  2. hamper

    hamper Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    37
    Адрес:
    Russia
    Почему не известен порядок? Насколько помню, Страуструп пишет:
    ...Можно, конечно, и в стандарт заглянуть...
     
  3. reversecode

    reversecode Guest

    Публикаций:
    0
    деструкторы вызываются в обратном порядке от создания

    сначала создается allocator m_alloc;
    потом A m_a;

    уничтожаются наоборот

    во всех компиляторах одинаково
     
  4. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    Во спасибо за ответ. А то я искал искал ченить по этому поводу так ниче и не нашел.
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Плохо искал. 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.