[英]c++ - ::operator new[] and allocation for my custom container
我遇到了一個無法解決的問題。 我正在編寫自己的容器,它或多或少類似於std::vector<T>
,但我不知道如何解決為對象分配內存的問題。
比如說,我在一個數組周圍寫了一個包裝器,並想像這樣分配數據:
T* cArray = new T[size];
cArray[index] = std::move(obj);
如果 obj 沒有不帶任何參數的默認構造函數,我會得到一個錯誤:“類:沒有合適的默認構造函數可用”。
所以我雖然我可以通過不使用 operator new 調用 obj 的構造函數來解決問題: static_cast<T*>(::operator new(sizeof(T)*this->cap))
並且這僅在我使用內置時才有效像int, double and floats
這樣的類型作為我的 Test 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
同樣,當我不使用內置類型時,這只是一個問題。 如果我刪除std::string
作為成員,一切都會按預期工作。 我不知道問題的原因可能是什么,也不知道經過數小時的搜索后如何解決。
大家知道怎么解決這個問題嗎?
一個答案是不存儲T[]
而是存儲具有相同大小和對齊要求的東西(最常見的選擇是aligned_storage )。 然后你使用placement new
操作符在其中構造項目,例如
new (&carray[index]) T(...args)
完成項目后,您需要手動調用每個項目的析構函數。
這是分配內存的正確方法。 但是您最終仍然需要調用構造函數,將空字節轉換為對象。 (稍后您需要調用析構函數。)
您需要使用“placement new”來調用構造函數:
new (&carray[index]) Test(obj)
你有正確的想法,至少前半部分是正確的。 這是分配原始內存,而不是使用new Test[N]
。 但是您仍然需要構建您的對象,您可以使用placement new 來完成。 給定一個指針p
指向您要構造對象的位置,您可以這樣做:
new (p) Test(...constructor args...);
另請注意,當您完成對象時,您將需要手動調用析構函數:
p->~Test();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.