2012-11-02 207 views
1

我想確認在以下情況下會發生的行爲。假設我有定義爲一些功能:何時銷燬對象?

std::vector<Object*> FuncA() 
Result FuncB() 

如果結果與構造

Result(const std::vector<Object*>& result) 
{ 
    this->result = result; 
} 

現在一個班,FuncB執行以下操作:

Result FuncB() { 
... some stuff here ... 
return Result(FuncA()) 
} 

當將矢量通過FuncA的返回被銷燬(有它的析構函數)?當結果超出範圍時會不會發生?持有對它的引用延長其生命期嗎?如果不是,你能解釋爲什麼,也許是一種方法來實現我所追求的?

感謝

編輯:下面是結果類

class Result 
    { 
    private: 
     std::vector<Object*> result; 

     void SetData(const Result& other); 
     void Free(); 

     // Constructs the result and takes ownership of the memory. 
     Result(const std::vector<Object*>& result); 

     Result(); 

    public: 
     Result(const Result& other); 
     Result& operator=(const Result& rhs); 
     ~Result(); 

     const Object& operator [] (int index); 
    }; 
+0

請張貼'Result'的定義。答案取決於內部存儲的內容。 –

+0

添加了定義 – user1520427

+3

不要使用指針矢量,它會很容易造成內存泄漏。如果你不想'std :: vector ',至少應該使用'std :: vector >'。 –

回答

2

如果Result持有的引用,那麼你有問題。在返回Result對象之前,由​​返回的對象將被銷燬。

現在,Result保持價值。這意味着​​的返回值將被複制到構造函數中。當物體是Result時,矢量將被銷燬。

如果你想避免拷貝,take the object by value in the constructor

Result(std::vector<Object*> result) 
    : result(std::move(result)) 
{} 

,或者,如果你不使用C++ 11(CF @Steve傑索普的評論)

Result(std::vector<Object*> result) 
{ 
    this->result.swap (result); 
} 
+0

哎呀,這是類定義中的拼寫錯誤,我的意思是在構造函數中有一個引用,但無論你回答我的問題,謝謝。我希望避免先構建vector,然後複製到'Result'中,我希望能夠'Result'有效地獲得它的所有權並延長它的生命週期 - 而不是複製它。 – user1520427

+1

@ user1520427:您沒有顯示構造函數的定義,只顯示了聲明,所以我們無法分辨它是否被複制,因此我們不得不承認您的意思。然而,由於'Result'的構造函數接受非const引用,因此Result(FuncA())'根據標準不合格。 MSVC允許它作爲擴展。另外,該構造函數是私有的,'FuncB'不是朋友,所以它的形式不合理是因爲第二個原因。除非我誤解,否則這不是真實的代碼,所以你可能得不到真正的答案。 –

+0

@ user1520427:查看關於該副本的更新。 –

1

這是最可能是你想做什麼的錯誤方式。當Result超出範圍時矢量被破壞。矢量中的指針指向的內存不。

所以你可以返回一個向量並且仍然使用它,但是如果這個向量副本中的指針被釋放,你將會遇到UB。

擁有std::vector<std::shared_ptr<Object>>反而會爲您節省很多麻煩。

+0

使用這個類的原因之一是處理內存問題,當它被破壞時它會釋放所有的指針。但是,是的,我可能應該完全使用shared_ptrs:/ – user1520427

+1

@ user1520427。但是當它被銷燬時釋放指針可能會給你帶來那些現在無效的指針的副本。 –

+0

嗯,這是真的,雖然我打算在這個特定情況下使用它,但我不認爲我會遇到這個問題。但無論如何,對於大多數情況下應該使用共享ptrs?什麼情況下最好不要使用它們? – user1520427