C++ мантра или почему порядок вызова конструкторов так важен.

Читать вдумчиво, с придыханием, каждое утро по 128 раз

“Порядок вызова конструкторов членов класса определяется только порядком их появления в объявлении класса. Список инициализации порядок не определяет”!

Полдня убил сегодня на поиск бага. Был класс с членом-смартпоинтером и еще одним членом, который инициируется таким же смартпоинтером:

class MyClass{
public:
MyClass(SmartPointerToSomeThing);
private:
    SomeOtherClass m_OtherClass;
    SmartPointerToSomeThing m_VeryImportantSmartPointer;
};

MyClass::MyClass(SmartPointerToSomeThing Ptr):
    m_VeryImportantSmartPointer(Ptr),
    m_OtherClass(m_VeryImportantSmartPointer)	///< fuck up is here
{
}

// Has to be instead:
MyClass::MyClass(SmartPointerToSomeThing Ptr):
    m_VeryImportantSmartPointer(Ptr),
    m_OtherClass(Ptr)                                        ///< Note - Ptr used instead of member
{
}

Что произошло в первом случае?

Да ничего страшного, просто члену нашего класс m_OtherClass  подсовывался еще не инициализированный экземпляр умного указателя. А не инициализирован он был потому, что в интерфейсе класса самрт поинтер этот объявлен позже m_OtherClass.

Что интересно, найти такой баг может быть очень-очень-очень сложно.

Leave a comment

0 Comments.

Leave a Reply

Yandex Mail.ru Google LiveJournal myOpenId Flickr claimId Blogger Wordpress OpenID Yahoo Technorati Vidoop Verisign AOL


[ Ctrl + Enter ]

10 visitors online now
10 guests, 0 members
Max visitors today: 13 at 03:20 am MST
This month: 17 at 02-07-2012 06:17 am MST
This year: 29 at 01-23-2012 02:50 am MST
All time: 45 at 02-23-2011 09:11 am MST