2015-11-03 96 views
1

我遇到內存違規錯誤,我不知道它來自哪裏。 我的問題是:我允許在構造函數初始化列表中獲取類成員的地址,以便我可以將它傳遞給需要對其進行引用的對象?C++在構造函數初始化列表中獲取類成員地址

例如:

class A 
{ 
}; 

class ReferencesA 
{ 
    A * const pA; 

    ReferencesA(A * ptrA) : pA(ptrA) { } 
}; 

class B 
{ 
    A a; 

    ReferencesA referencesA; 

    B() : referencesA(& a) { } 
}; 

是安全地& a構造函數初始化列表裏面?在我看來,這將是,但事情並不總是像我們預期的那樣工作。

謝謝。

+0

對我來說沒關係。這可能是「引用A」對引起崩潰的內存中的ptrA做了什麼,特別是如果「a」尚未構建。 – rakeshdn

回答

2

class B中基礎構件的初始化順序是a,然後是referencesA。這是因爲它們在類聲明中以的順序出現。 (它們出現,如果有的話,在你的構造函數初始化列表中的順序是不相關的。)

因此,使用&a初始化referencesA安全的,如果有點脆。在你的情況下,&a是默認構建的成員a的地址。

我建議不要這樣編碼,以防有人更改班上成員的順序。

+1

謝謝。問題是,如果我想要const指針(或引用)來指示指針將在對象的整個生命週期中是相同的和有效的,那麼我需要初始化初始化器列表中的東西,否則我可以'使用const。 – Virus721

+4

值得注意的是,保存指向未初始化對象的指針是安全的,所以類中的順序並不重要。如果你想通過指針來讀或寫,'a'只需要在班級列表中首先出現。 –

相關問題