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被巧妙地添加以克服分配内存的 MalOC/<代码>行为。p>


    <> P> >您不能改变这种行为。C++中调用< <代码> > < <代码> >有两件事:

  • 为正在创建的对象分配足够的内存&
  • 提供通过调用对象的构造函数正确初始化对象的机会
  • 这是C++语言的基本设计特点,PT 2被巧妙地添加以克服分配内存的 MalOC/<代码>行为。p>


    简而言之,您无法更改此行为。

    依赖于构造函数签名的不是内存分配。这是初始化完成的

    即使在您的示例中,分配也由
    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 );
    
    因此,这仍然需要使用构造函数,但调用方可以选择构造函数(通过选择参数)。如果没有可用的默认构造函数,调用方只需提供调用非默认构造函数所需的参数