1)什麼是簡單CARRAY問題
CArray <SomeClass> collection;
和
CArray <SomeClass,SomeClass> collection;
甚至
CArray <SomeClass* ,SomeClass* > collection;
之間的區別?
2.)在閱讀Stackoverflow上的一些評論時,我來到一個註釋「不要使用CArray」。爲什麼要不要使用CArray?
1)什麼是簡單CARRAY問題
CArray <SomeClass> collection;
和
CArray <SomeClass,SomeClass> collection;
甚至
CArray <SomeClass* ,SomeClass* > collection;
之間的區別?
2.)在閱讀Stackoverflow上的一些評論時,我來到一個註釋「不要使用CArray」。爲什麼要不要使用CArray?
此:
CArray <SomeClass> collection;
等效於此:
CArray <SomeClass, const SomeClass&> collection;
第二個模板參數用於指定通過該部件被訪問的類型。模板參數are described in the documentation on MSDN。
此:
CArray <SomeClass* ,SomeClass* > collection;
商店指針SomeClass
類型的對象的集合,而SomeClass
類型的對象的其他兩個店集合。至於爲什麼你「不應該使用它」,作爲C++語言標準的一部分,因此便攜的std::vector
對於大多數項目來說可能是更好的選擇。如果您的遺留代碼使用CArray
,那麼您可能需要使用它,並且沒有任何問題。
2)由於CArray在添加新元素時重新分配內存。
不同之處在於存儲在CArray
對象中的內容以及它如何存儲在對象中,無論CArray
元素是對象還是指向某些類的對象的指針。
CArray
似乎有一些意想不到的行爲。它已經存在了很長一段時間,並被設計爲適合MFC生態系統。 C++標準模板庫vector
具有更好,更通用的特性,特別是在處理除簡單數據類型以外的對象時。
我的經驗是使用CList
和CArray
以及指向對象的指針。這樣做,他們似乎更容易預測,但您確實需要擔心管理內存。從看着afxtempl.h
源
的一個問題是,當CArray
通過內部功能SetSize()
,製成大的memcpy_s()
功能用於複製從一個存儲器區域CArray
元件到另一個。所以你需要注意指針和CArray
元素的淺拷貝。而且由於使用了memcpy_s()
而不是memmove_s()
,如果您在重疊內存區域做了一些奇怪的事情,可能會有問題。
這可能是我爲什麼用CArray
作爲指向對象的容器的體驗好得多。
有趣的是它看起來像Append()
和Copy()
方法使用的內部函數CopyElements()
執行的元素賦值,而不是一個memcpy_s()
函數調用的元素。但是,這些方法與CArray
對象一起使用,而不是與單個元素一起使用。
CArray
從CObject
派生,這意味着數據結構將具有所有行李號CObject
。然而,在MFC世界裏,像序列化一樣,還有一些好的東西。
它看起來像你應該使用一個引用作爲第二個模板參數,所以如果你正在使用一個類,你應該使用CArray <SomeClass, SomeClass &> collection;
。當我沒有這樣做時,我遇到了問題,直到我發現從MFC Collections: The CArray Class創建陣列列表。
和std :: vector? – Andrey 2010-05-05 13:44:58
-1:這不是原因。矢量做同樣的事情 – 2010-05-05 14:30:44