2013-07-31 91 views
2

我正在做一些矩陣類,我想知道什麼時候創建一個臨時對象,它是本地的功能權?所以它應該在函數返回時超出範圍,但我不知道爲什麼在這種情況下不會發生這種情況,我可以在函數返回後使用它。使用const引用時創建臨時變量

下面是一個例子,這是構造函數:

int *data; //member of class 
Matrix3(const int (&ar)[N*N]) 
{ 
    data = const_cast<int*>(ar); 
} 

,這裏是我如何使用它:

Matrix3 m = { {1,2,3,4,5,6,6,6,6} }; 

現在我仍然可以從析構函數訪問該對象通過data指針這是正常的嗎?臨時變量是在堆上創建的呢?

+1

數據在類的實例中,只要實例處於活動狀態,您可以訪問它 – aaronman

+0

因此,如果我沒有將其分配給數據,它會繼續存在,直到類被銷燬? –

+0

如果我明白你的意思是 – aaronman

回答

2

臨時端中的陳述或聲明的介紹了它,而不是在的最後的分號壽命功能。 (否則,無害循環,易引起堆棧溢出。)

如果您使用的對象引用其生命週期結束後(這裏的陣列,例如),那麼你得到未定義行爲。 C++不會跟蹤死對象,以告訴您何時使用死對象。你碰巧從死亡數組中找到信息。但是別的東西可能會重用內存,或者它可能已經返回到系統,並且可能會出現段錯誤。

避免懸掛引用和指針。不要認爲,如果它在測試案例中起作用,那它在現場工作。

+0

@aaronman命名對象在超出範圍時被銷燬(在塊的結尾或程序終止時)。未命名的對象,又名臨時對象,在聲明結束時銷燬,除非聲明是對臨時聲明的參考聲明。 – Potatoswatter

+0

哦,我的壞,我想到的名字變種不是臨時工,在這個問題的代碼必須困惑我:) – aaronman

0

執行完行後,臨時數組被破壞,數據指針變爲無效。

+0

所以這只是這個內存不被任何部分使用或尚未?爲什麼我仍然可以從析構函數中獲取它,這是我的觀點? –

0
int *data; // is a member, so it goes out of scope when the object is destroyed 

但是,如果在這樣的函數中聲明它:

void someFunction() { 

    int *data; 


} 

// pointer is lost now and is inaccessible