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快得多,尽管它不应该用于生产代码,这也很好.谢谢你的回答,伙计!