2009-04-21 154 views
7

我不知道什麼是錯的這個(記住我有點八九不離十新的C++)返回類指針

我有這個類:

Foo 
{ 
    string name; 
    public: 
    SetName(string); 
} 
string Foo::SetName(string name) 
{ 
    this->name = name; 
    return this->name; 
}; 
////////////////////////////////////////////// 
//This is where I am trying to return a Foo pointer from this global function: 

Foo * ReturnFooPointer() 
{ 
    Foo foo; 
    Foo * foo_ptr; 
    foo_ptr = &foo; 
    return foo_ptr; 
} 

在編譯時,這個編譯得很好。然而在運行時,它會拋出運行時異常(某種訪問衝突)

我在做什麼錯?

+1

該代碼無法編譯。您錯過了Foo上的類關鍵字。 – 2009-04-21 19:42:34

回答

19

您需要使用new關鍵字來替代在堆上創建新的Foo。
函數結束時,堆棧中的對象將被釋放,因此您將返回一個指向內存中無效位置的指針。

這裏是正確的代碼。

Foo * ReturnFooPointer() 
{ 
    Foo * foo_ptr = new Foo(); 
    return foo_ptr; 
} 

記住稍後要刪除您要返回的指針。

所以後來在代碼:

Foo *pFoo = ReturnFooPointer(); 
//Use pFoo 
//... 
delete pFoo; 
+0

我有一個小問題來確認。變量foo_ptr仍然有自動存儲,對吧?我的意思是它所指向的內存仍然保留,直到它被'delete'釋放,但變量本身一旦離開(函數)作用域就被移除。 – zgulser 2017-11-03 14:29:13

5

你返回一個指向棧上的局部對象。當函數返回時它超出了範圍,並且是無效的。

您應該創建一個新的實例返回,即

Foo* foo_ptr = new Foo(); 

這將在堆上創建對象,將生活,直到你調用它delete

1

實際的對象被分配到堆棧上,所以它在超出範圍時被銷燬(當函數返回時)。如果您將其分配到堆上(使用new),它將一直存在,直到您delete