C++ c++;-::运算符new[]和我的自定义容器的分配

C++ c++;-::运算符new[]和我的自定义容器的分配,c++,arrays,containers,new-operator,allocation,C++,Arrays,Containers,New Operator,Allocation,我遇到了一个我无法解决的问题。 我正在编写自己的容器,它或多或少类似于std::vector,我不知道如何解决为对象分配内存的问题 例如,假设我在数组周围编写了一个包装器,并希望像这样分配数据: T* cArray = new T[size]; cArray[index] = std::move(obj); struct Test { Test(int x){} std::string s; double d; } MyVector<Test> vec;

我遇到了一个我无法解决的问题。 我正在编写自己的容器,它或多或少类似于
std::vector
,我不知道如何解决为对象分配内存的问题

例如,假设我在数组周围编写了一个包装器,并希望像这样分配数据:

T* cArray = new T[size];
cArray[index] = std::move(obj);
struct Test
{
    Test(int x){}
    std::string s;
    double d;
}

MyVector<Test> vec;
vec.push_back(Test(1));
如果obj没有一个默认构造函数,它不接受任何参数,我会得到一个错误:“类:没有合适的默认构造函数可用”

因此,我认为我可以通过使用操作符new:
static\u cast(::操作符new(sizeof(T)*this->cap))
来解决这个问题,并且只有当我使用内置类型,如
int、double和floats,作为测试obj的成员时,这才有效

如果我这样做:

T* cArray = new T[size];
cArray[index] = std::move(obj);
struct Test
{
    Test(int x){}
    std::string s;
    double d;
}

MyVector<Test> vec;
vec.push_back(Test(1));
在第106行的文件xmemory0中:

表达式:“(\u Ptr\u user&(\u BIG\u ALLOCATION\u ALIGNMENT-1))==0

同样,这只是我不使用内置类型时的一个问题。如果我作为成员删除
std::string
,一切都会按预期工作。我不知道问题的原因可能是什么,也不知道在数小时的搜索后如何解决


你们知道如何解决这个问题吗?

这是分配内存的正确方法。但最终还是需要调用构造函数,将空字节转换为对象。(稍后需要调用析构函数。)

您需要使用“placement new”来调用构造函数:

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

您的想法是正确的,至少前半部分是正确的。这是分配原始内存,而不是使用
new Test[N]
。但是您仍然需要构造对象,您可以使用placement new进行构造。给定指向要构造对象的位置的指针
p
,您可以执行以下操作:

new (p) Test(...constructor args...);
还请注意,处理完对象后,需要手动调用析构函数:

p->~Test();

一个答案是不存储
T[]
,而是存储相同大小和对齐要求的内容(最常见的选择)

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

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

谢谢您的回答,伙计,我使用了您所有的3个答案解决了这个问题,不知道应该标记哪一个。另外,我的自定义向量在插入时比std::vector快得多,尽管它不应该用于生产代码,这也很好.谢谢你的回答,伙计!