簡體   English   中英

c++ - ::operator new[] 和我的自定義容器的分配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM