我一直在搜索,但找不到答案。有没有办法告诉new
运算符不能调用类构造函数?
MyObject* array = new MyObject[1000];
这将拨打MyObject()
一千次!我想自己填充分配的内存,不需要在构造函数中初始化任何信息。使用malloc()
不是非常和谐的C ++代码imho。
MyObject* array = (MyObject*) malloc(sizeof(MyObject) * 1000);
答案 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个对象吗?
除此之外,如果构造函数没有被调用,那么对象将如何被构造?