2015-09-27 91 views
2

我有一個問題,我不能包裹我的頭。 我正在寫我自己的容器,它或多或少像std::vector<T>,我不知道如何解決分配對象的內存問題。C++ - ::運營商新的[]和分配我的自定義容器

比方說,比如我寫圍繞數組的包裝,並希望這樣的分配數據:

T* cArray = new T[size]; 
cArray[index] = std::move(obj); 

如果OBJ沒有不帶任何參數生病得到一個默認的構造函數錯誤:「類:沒有適當的默認構造函數可用」。

所以我雖然我可以通過調用不使用new運算符與obj的構造解決問題:static_cast<T*>(::operator new(sizeof(T)*this->cap))而且這隻有當我使用內置的類型,如int, double and floats作爲成員,我的判斷obj。

如果我做這樣的事情:

struct Test 
{ 
    Test(int x){} 
    std::string s; 
    double d; 
} 

MyVector<Test> vec; 
vec.push_back(Test(1)); 

我得到一個運行時錯誤,如果我嘗試將數據分配給我的push_back函數,它包含以下行的位置:

cArray[index] = std::move(obj); 

在文件:106行上的xmemory0:

Expression: "(_Ptr_user & (_BIG_ALLOCATION_ALIGNMENT -1)) == 0

同樣,這只是一個問題,當我不使用bu ilt-in類型。如果我刪除std::string作爲成員,則所有操作都按預期工作。我不知道問題的原因可能是什麼,也不知道如何在搜索幾小時後解決問題。

你們知道如何解決這個問題嗎?

回答

0

你有正確的想法,至少上半年它。這是分配原始內存,而不是使用new Test[N]。但是你仍然需要構建你的對象,你可以使用新的位置進行構建。給定一個指針p指向要構造一個對象的位置,你可以這樣做:

new (p) Test(...constructor args...); 

還要注意的是,當你這個對象,您將需要手動調用析構函數:

p->~Test(); 
+0

謝謝你的答案隊友,我解決了所有3個答案的問題,不知道我應該標記哪一個。另外它的一種很好,我的自定義矢量插入方式比std :: vector更快,即使它不應該用於生產代碼。 – Jones

0

這是分配內存的正確方法。但是您仍然需要最終調用構造函數,將空字節轉換爲對象。 (後來就需要調用析構函數)。

你需要使用「放置新的」調用構造函數:

new (&carray[index]) Test(obj) 
1

一個答案是不存儲T[]而是存儲相同大小和對齊要求的東西(的選擇是最常見aligned_storage)。然後,您使用placement new運算符來構造其中的項目,例如

new (&carray[index]) T(...args) 

當您完成項目時,您需要手動調用每個項目上的析構函數。

+0

謝謝你的回答! – Jones