2011-02-05 73 views
1
vector< MyObject<MyType> > ObjectList(100, MyObject<MyType>(param1)); 

MyObject的內部創建一個名爲「存儲裝置」部件,其是使用在堆上的MyType的陣列。與由矢量稱爲構造奇怪的問題<T>

但是,使用上面的代碼行,ObjectList中的每個項目都有'存儲'指向相同的內存位置(基本上共享存儲)。

當我使用

MyObject<MyType> ObjectList[100] = { MyObject<MyType>(param1), 
            MyObject<MyType>(param1), ...}; 

每一個存儲有它自己的內存位置,當我宣佈上述線路爲MyObject手動分配堆棧上的列表不會發生此問題。

+5

MyObject的複製constrcutor是什麼樣的? – Flexo 2011-02-05 09:01:37

回答

9

但是使用上述代碼行,在每個鏈表類 項具有「存儲裝置」 指向相同的存儲器位置 (基本上共享存儲)。

如果你已經寫了適當的拷貝構造函數MyObject(和MyType如果它也包含指針),則不會發生這種情況,因爲ObjectList副本你通過什麼初始化。

通過「適當」我的意思是拷貝構造函數這確實深拷貝,而不是淺拷貝

看到這個:

What is the difference between a deep copy and a shallow copy?

2

要在上面的答案擴大,需要打破你的代碼行:

vector< MyObject<MyType> > ObjectList(100, MyObject<MyType>(param1))

到它的兩個組成部分:

MyObject<MyType> myObject(param1)
vector< MyObject<MyType> > ObjectList(100, myObject)如你所見,你創建'myObject'一次,然後調用它的拷貝構造函數100倍(而不是創建100x MyObjects)。

根據你所期望的你沒有創建自定義拷貝構造函數來判斷 - 所以得到(正如其他人所提到的)默認的「淺拷貝」行爲。我還建議不要在MyObject中使用裸指針/堆分配(例如,MyType * t = new MyType [param1]),而是使用另一個向量來實現存儲,這已經支持您可能期望的複製機制。