C++ 我可以简单地调用分配内存上的构造函数,而不是调用新的吗?

C++ 我可以简单地调用分配内存上的构造函数,而不是调用新的吗?,c++,C++,因此,我有一个类似于pool类的容器,它基本上是std::vector块的包装器,其中通过执行以下操作分配内存: char* block = new char[elementSize * blockSize]; blocks.push_back( block ); 此池有一个void*get\u addr std::size\t n,返回元素n的内存地址 我知道,我可以通过以下方式在那里构建一个新对象: 新的get_addrn对象参数; 但我也可以这样做: // Create a suppli

因此,我有一个类似于pool类的容器,它基本上是std::vector块的包装器,其中通过执行以下操作分配内存:

char* block = new char[elementSize * blockSize];
blocks.push_back( block );
此池有一个void*get\u addr std::size\t n,返回元素n的内存地址

我知道,我可以通过以下方式在那里构建一个新对象: 新的get_addrn对象参数; 但我也可以这样做:

// Create a supplimentary method
T& get( std::size_t n ) { return *static_cast<T*>( get_addr(n) ); }
// ... 
// ...
// and an example usage, where Object is arbitrary
Object& obj = pool.get( 10 );
obj = Object( args );
我两种方法都试过了,当然新的布局方法是有效的,但是第二种构造方法也是有效的。
所以我感兴趣的是,为什么我不应该使用第二种方法,是否有任何限制,或者这样做是安全的。

这样做是完全不安全的,因为您正在分配给一个未初始化的对象。这将打破几乎任何复杂的类型


Placement new实际上是在分配的内存上调用构造函数——这就是它的工作和目的。你问的问题根本没有意义。如何在不使用X的情况下使用语言功能X?。在使用对象之前,必须先构造对象。

这样做是完全不安全的,因为您正在为未初始化的对象赋值。这将打破几乎任何复杂的类型


Placement new实际上是在分配的内存上调用构造函数——这就是它的工作和目的。你问的问题根本没有意义。如何在不使用X的情况下使用语言功能X?。在使用对象之前,必须先构造对象。

那么obj=Object args;//这就是我要问的方法。它将创建一个新对象,并将其分配给obj。相当多的行动…你为什么要这么做?Placement new是执行您想要执行的操作的语法,为什么要避免使用它?如果对象具有默认运算符=且其任何成员变量具有运算符=且该运算符不仅仅在对象的内存上执行写入操作,则它是不安全的。但是是的,placement new只在预先分配的内存上调用构造函数,而您的方法首先调用copy构造函数,然后调用operator=,这可能不安全,所以为什么不使用placement new呢?mattnewport,好吧,因为我想使使用该元素像obj=Object一样简单;obj.foo而不是新的get\u addrn对象;obj=pool.getn;obj.foo;不过感谢您的警告,看起来我将使用placement new。那么obj=Object args;//呢这就是我要问的方法。它将创建一个新对象,并将其分配给obj。相当多的行动…你为什么要这么做?Placement new是执行您想要执行的操作的语法,为什么要避免使用它?如果对象具有默认运算符=且其任何成员变量具有运算符=且该运算符不仅仅在对象的内存上执行写入操作,则它是不安全的。但是是的,placement new只在预先分配的内存上调用构造函数,而您的方法首先调用copy构造函数,然后调用operator=,这可能不安全,所以为什么不使用placement new呢?mattnewport,好吧,因为我想使使用该元素像obj=Object一样简单;obj.foo而不是新的get\u addrn对象;obj=pool.getn;obj.foo;谢谢你的警告,看起来我会使用新的布局。