2012-10-17 35 views
1

Hy,我想問一個困惑我的問題。C++ - 使用std :: vector&related內存管理的正確方法

我有一類這樣的:

class A { 

private: 
std::vector<Object*>* my_array_; 

... 

public 
std::vector<Object*>& my_array(); // getter 
void my_array(const std::vector<Object*>& other_array); // setter 
}; 

我想問問你,根據你的經驗,什麼是執行的(可能的)安全的方式setter和getter的正確途徑。

我想到的第一個解決方案如下。 A)檢查輸入是否是指我已經保存的數據結構; B)釋放my_array_指向的所有對象的內存C)複製other_array指向的每個對象,並將其副本添加到my_array_ D)最後結束該函數。

爲了以防萬一,getter可能會生成內部數組的副本。

問題很多: - 這個策略是否過度使用? - 它真的可以避免問題嗎? - 有人真的使用它或有更好的方法嗎?

我試着尋找這個問題的答案,但沒有發現任何特別關注這個問題。


在需要使用智能指針是一個很好的答案,謝謝你們..好像我不能給「有用的答案」不止一個,所以我提前道歉。 :-)

從你的答案中可以得出一個新的疑問。 當我使用包含unique_ptr對象的向量時,我將不得不定義一個深層拷貝構造函數。鑑於現在我們正在使用智能指針,是否有比使用迭代器複製對象矢量中的每個元素更好的方法?

+1

爲什麼在對象中有指向'std :: vector'的指針? –

+2

*咳嗽* ..不好的設計? –

+0

請定義「SAFE」。 –

回答

1

我通常不推薦使用指向矢量的指針作爲成員,但是從您的問題看來,它好像是在多個實例之間共享的。

這麼說,我會跟去:

class A { 
private: 
    std::shared_ptr<std::vector<std::unique_ptr<Object> > > my_array_; 

public 
    std::shared_ptr<std::vector<std::unique_ptr<Object> > > my_array(); // getter 
    void my_array(std::shared_ptr<std::vector<std::unique_ptr<Object> > > other_array); // setter 
}; 

沒有必要的檢查,沒有內存管理問題。

如果內部Object也是共享的,請使用std::shared_ptr而不是std::unique_ptr

+0

出於興趣,如果A擁有該結構,您是否認爲getter應該通過引用返回,並且擁有unique_ptr? - 從而更清楚地表達了這種關係。如果你有時間的話,只是在意見之後。 – 111111

+0

@ 111111事情是我不認爲A擁有結構。 –

+0

但如果它確實如此,那你會怎麼做? – 111111

1

我認爲你是過於複雜的東西有指向std::vector作爲數據成員;記住C++不是Java(C++比基於「reference」的更「基於價值」)。

除非有充分的理由使用指向std::vector的指針作爲數據成員,否則我只需使用存儲在「按值」的簡單std::vector

現在,關於在vectorObject*指針,你應該問自己:是指那些觀察指針或者是那些擁有指針

如果vector只是觀察Object S(和它們被別人擁有的,就像一個對象池分配器或某事),你可以使用原始指針(即簡單Object*)。 但如果矢量在Object上有一些所有權語義,則應該使用shared_ptrunique_ptr智能指針。如果向量是僅有的所有者Object實例,請使用unique_ptr;否則,使用shared_ptr(其使用引用計數機制來管理對象生存期)。

class A 
{ 
public: 
    // A vector which owns the pointed Objects 
    typedef std::vector<std::shared_ptr<Object>> ObjectArray; 

    // Getter 
    const ObjectArray& MyArray() const 
    { 
     return m_myArray 
    } 

    // Setter 
    // (new C++11 move semantics pattern: pass by value and move from the value) 
    void MyArray(ObjectArray otherArray) 
    { 
     m_myArray = std::move(otherArray); 
    } 

private: 
    ObjectArray m_myArray; 
}; 
+0

太棒了,謝謝!您的澄清幫助 –

+0

@ V'GerRobert:謝謝。我很高興它有幫助。 –