C ++未初始化的类实例数组

时间:2013-05-01 10:16:03

标签: c++ new-operator initialization alloc

我一直在搜索,但找不到答案。有没有办法告诉new运算符不能调用类构造函数?

MyObject* array = new MyObject[1000];

这将拨打MyObject()一千次!我想自己填充分配的内存,不需要在构造函数中初始化任何信息。使用malloc()不是非常和谐的C ++代码imho。

MyObject* array = (MyObject*) malloc(sizeof(MyObject) * 1000);

4 个答案:

答案 0 :(得分:6)

malloc等效的C ++是分配函数operator new。您可以像这样使用它:

MyObject* array = static_cast<MyObject*>(::operator new(sizeof(MyObject) * 1000));

然后,您可以使用placement new构建一个特定对象:

new (array + 0) MyObject();

0替换为您希望初始化的偏移量。

但是,我想知道你是否真的想自己做这个动态分配。也许std::map<int, MyObject>std::unordered_map<int, MyObject>更适合您,以便您可以在任何索引处创建MyObject

std::unordered_map<int, MyObject> m;
m[100]; // Default construct MyObject with key 100

答案 1 :(得分:4)

实际上,使用malloc与C ++代码不太一致。但malloc完全符合您的要求。所以我担心你所要求的与C ++不一致。我想你只需要决定用C或C ++编写什么语言。

我认为你唯一的另一个真正选择是重写MyObject,因此它没有任何构造函数,但这也不是C ++方式。

答案 2 :(得分:3)

只需使用std :: vector

std::vector<MyObject> v;

v.reserve(1000); // allocate raw memory
v.emplace_back(42); // construct in place

用于随机访问(这基本上是std :: vector在内部执行的操作):

typedef std::aligned_storage<sizeof(MyObject), std::alignment_of<MyObject>::value>::type Storage;
MyObject* myObjects(reinterpret_cast<MyObject*>(new Storage[1000]));

new (myObjects + 42) MyObject(/* ? */); // placement new
(*(myObjects + 42)).~MyObject();

答案 3 :(得分:0)

你有时间吗?需要“太长时间”吗?这在执行程序时是否只发生一次,就像在开始时一样?首先确定它实际上是一个问题。

你真的需要以这种方式分配1000个对象吗?

除此之外,如果构造函数没有被调用,那么对象将如何被构造?