C++ 创建独立于构造函数参数的对象指针
我正在尝试创建一个类似容器向量的向量 然后宣布:C++ 创建独立于构造函数参数的对象指针,c++,pointers,constructor,placement-new,C++,Pointers,Constructor,Placement New,我正在尝试创建一个类似容器向量的向量 然后宣布: Vector< A> Avector. VectorAvector。 在分配内存时,会出现编译错误,即A没有默认构造函数。 我编写了以下代码来分配内存 char *pBuffer = (char*) malloc(size*sizeof(T)); T *array; for(int i = 0; i < size; i++) { (array+i) = new(pBuffer + i) T; }
Vector< A> Avector.
VectorAvector。
在分配内存时,会出现编译错误,即A没有默认构造函数。
我编写了以下代码来分配内存
char *pBuffer = (char*) malloc(size*sizeof(T));
T *array;
for(int i = 0; i < size; i++)
{
(array+i) = new(pBuffer + i) T;
}
return array;
char*pBuffer=(char*)malloc(size*sizeof(T));
T*阵列;
对于(int i=0;i
T是一个模板变量
这个错误是因为在placement new中,我使用了T的默认构造函数,而我没有为a编写默认构造函数
我想知道,有没有办法使内存分配不依赖于构造函数签名调用<代码>新< /C> >有两件事:
这是C++语言的基本设计特点,PT 2被巧妙地添加以克服分配内存的
<> P> >您不能改变这种行为。C++中调用< <代码> > < <代码> >有两件事:
这是C++语言的基本设计特点,PT 2被巧妙地添加以克服分配内存的
简而言之,您无法更改此行为。
malloc
执行,而不调用任何构造函数。初始化(由placement new执行)需要使用构造函数
如果不调用用户定义对象的构造函数,则无法初始化该对象
但是,至少在C++11中,您可以做的是将代码放入一个函数中,该函数将构造函数所需的参数作为右值引用,并将它们传递给新位置中的构造函数调用。这样,函数的调用方就可以传递正确的参数。如果未传递任何参数,将调用默认构造函数
这实际上是新的std::vector的
template< class... Args >
void emplace_back( Args&&... args );
因此,这仍然需要使用构造函数,但调用方可以选择构造函数(通过选择参数)。如果没有可用的默认构造函数,调用方只需提供调用非默认构造函数所需的参数。内存分配并不取决于构造函数签名。这是初始化完成的
即使在您的示例中,分配也由malloc
执行,而不调用任何构造函数。初始化(由placement new执行)需要使用构造函数
如果不调用用户定义对象的构造函数,则无法初始化该对象
但是,至少在C++11中,您可以做的是将代码放入一个函数中,该函数将构造函数所需的参数作为右值引用,并将它们传递给新位置中的构造函数调用。这样,函数的调用方就可以传递正确的参数。如果未传递任何参数,将调用默认构造函数
这实际上是新的std::vector的
template< class... Args >
void emplace_back( Args&&... args );
因此,这仍然需要使用构造函数,但调用方可以选择构造函数(通过选择参数)。如果没有可用的默认构造函数,调用方只需提供调用非默认构造函数所需的参数