gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:37 25 4
gpt4 key购买 nike

我遇到了一个无法解决的问题。我正在写我自己的容器,它或多或少像一个 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 这样的内置类型时才有效作为我的测试对象的成员。

如果我这样做:

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);

在文件中:xmemory0 第 106 行:

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

同样,这只是当我不使用内置类型时才会出现的问题。如果我删除 std::string作为成员(member),一切都按预期进行。经过数小时的搜索,我不知道问题的原因可能是什么,也不知道如何解决。

你们知道怎么解决这个问题吗?

最佳答案

一个答案是不存储 T[] 而是存储相同大小和对齐要求的内容(最常见的选择是 aligned_storage )。然后你使用 placement new运算符在其中构造项目,例如

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

完成项目后,您需要手动调用每个项目的析构函数。

关于c++ -::operator new[] 和我的自定义容器的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32810203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com