2011-12-10 90 views
2

時,這是從 Safe in C# not in C++, simple return of pointer/reference,C++對象 - 返回一個指針

的後續問題是:

person* NewPerson(void) 
{ 
    person p; 
    /* ... */ 
    return &p; //return pointer to person. 
} 

一樣?

person* NewPerson(void) 
{ 
    person* pp = new person; 

    return pp; //return pointer to person. 
} 

我知道第一個是壞主意,因爲它將是一個野指針。 在第二種情況下,對象是否會在堆上安全 - 並且像在c# 中當最後一個引用已到達時超出範圍?

+1

這些都不是C#代碼。第二個是C++中的內存泄漏,如果你不手動釋放它的話。 – CodesInChaos

+0

他們不一樣,都是一個壞主意。 –

回答

2

它很安全,返回後對象仍然活着。

但不要指望在C++中自動清理對象。標準C++沒有垃圾收集。您需要自己使用delete對象,或者使用某種形式的智能指針。

0

後者是安全的。但是,C++通常不提供垃圾收集,因此您需要安排返回對象的明確delete

0

就像你說的,第一種情況不好,因爲指針將無效。至於第二種情況,C++中的內存不受管理,你必須自己清理。 C++不會跟蹤正常指針上的引用,這就是std::shared_ptr的用途。

1
person* NewPerson(void) 
{ 
    person* pp = new person; 

    return pp; //return pointer to person. 
} 

我知道,第一個是一個壞主意,因爲這將是一個野生 指針。在第二種情況下,對象是否會在堆中安全 - 並且像c#中那樣的 在最後一個引用被刪除時超出了範圍?

更正第一個問題:它將返回一個指向該functin堆棧上數據的指針,該函數完成後將被回收和修改。

第二種情況:對象是在堆上創建的,它與執行堆棧是分開的。當函數完成時,堆上的對象是安全的並保持不變。但是,C++不會自動執行垃圾收集,所以如果你丟失了所有對堆對象的引用,這將構成內存泄漏 - 在程序結束之前,對象的空間不會被回收。

3

是的,第二種情況是安全的。

但是,調用者將需要delete返回的指針。你可以改變這種使用boost::shared_ptr,當它不再使用它會被破壞:

boost::shared_ptr<person> NewPerson() 
{ 
    boost::shared_ptr<person> pp = boost::make_shared<person>(); 

    return pp; 
} 

如果C++ 11,那麼你可以使用std::shared_ptrstd::unique_ptr

+0

好的如果被引用的指針設置爲0(空)?或者超出範圍,就像在c#中一樣# – Niklas

+0

如果超出範圍,或者您通過調用返回的智能指針上的'reset()'設置爲NULL。 – hmjd