在下面的代碼已經被證明是不安全的,因爲如果構造函數拋出,析構函數不會被調用,泄漏資源的演講:使用委託構造,防止泄漏
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 2014-10-06 11:02:34
這是STL 2013年GoingNative的演講,對嗎? – 2014-10-06 11:07:50
我認爲類名'TwoResources'暗示更可行的解決方案;每個類(或對象)一個資源。如果兩種資源的管理不同,則將每個資源包裝在自己的RAII類中,並使其成爲更高級別的成員。 – Niall 2014-10-06 11:49:50