В разговоре следующий код, как был показан, чтобы быть небезопасны, потому что, если конструктор бросков, деструктор не будет называться и ресурсы утечки:Использования делегирования конструктора, чтобы избежать утечек
class TwoResources {
TwoResources(int x, int y)
: m_a(nullptr), m_b(nullptr) {
m_a = new A(x); m_b = new B(y);
}
~TwoResources() {
delete m_b; delete m_a;
}
A * m_a; B * m_b;
};
Раствора предложения использовать делегирование конструктора, например, так:
class TwoResources {
TwoResources() : m_a(nullptr), m_b(nullptr) { }
TwoResources(int x, int y) : TwoResources() {
m_a = new A(x); m_b = new B(y);
}
~TwoResources() {
delete m_b; delete m_a;
}
A * m_a; B * m_b;
};
Это безопасно потому, что:
C++ 11 15.2 [except.ctor]/2: «если конструктор без делегирования для объекта завершен, и конструктор делегирования для этого объекта существует с исключением, деструктор объекта будет вызван ».
Однако в том же слайде, он говорит:
Просто потому, что вы можете воспользоваться этим правилом не означает, что вы должны!
Если этот код гарантированно надежен, то каковы возможные проблемы с ним?
Это, вероятно, плохая идея, чтобы использовать 'новый/delete' в C++ 11 код вручную. Вы должны использовать интеллектуальные указатели, чтобы избежать таких проблем. – ForEveR
Это разговор STL на GoingNative 2013, правильно? –
Я думаю, что название класса 'TwoResources' намекает на более жизнеспособное решение; один ресурс для каждого класса (или объекта). Если управление этими двумя ресурсами отличается, оберните их в свой класс RAII и включите их в класс более высокого уровня. – Niall