2010-10-12 75 views
1

你好,我有一個返回指針的函數類:從C++中的成員函數返回一個指針

int* Maze::GetStart() 
{ 
    int startNode = 1; 

    return &startNode; 
} 

將函數返回指針後的StartNode的值被刪除?

如果我這樣做,而不是值將被保存?

int Maze::GetStart() 
{ 
    int startNode = 1; 

    return startNode ; 
} 

main 
{ 
    int* pStart = maze.GetStart(); 
} 

回答

4

會的StartNode的值被刪除 該函數返回 指針後?

一旦函數GetStart()返回,變量startNode將不復存在,所以從這個意義上說,是的。

但是,您的代碼通過將地址返回給一旦GetStart()返回就會消失的事物,爲未定義的行爲開闢了一個巨大的機會。如果調用者嘗試解除返回的node*,則可能發生任何事情。此外,代碼無法按原樣編譯,因爲您無法將int*隱式轉換爲node*

但是,如果你的價值迴歸,那麼你應該罰款:

int Maze::GetStart() 
{ 
    int startNode = 1; 
    return startNode; 
    // return 1; // Why not do this? 
} 

int pStart = maze.GetStart(); // Get returned value as int, not pointer to int. 
+0

謝謝我根據你的回答更新了我的問題。 – Arizona1911 2010-10-12 04:38:03

+0

好的,但我想指向返回值的指針。我的更新代碼是否指向值1? – Arizona1911 2010-10-12 04:40:07

+0

@ Arizona1911:你的意思是「返回值的指針」?你爲什麼需要這樣做? – 2010-10-12 04:41:49

1

返回分配堆棧沒有任何意義可言變量的地址。只要函數GetStart()返回,變量startNode的生存時間就會結束。它是否是一個自由函數或成員函數並不重要。

我認爲,在gcc/g ++中有一個警告。

基於問題編輯:

如果要修改的變量並保存修改狀態,那麼它必須聲明爲static。見static local variables