6

我一直在寻找,但找不到这个问题的答案。有没有办法告诉new操作员不要调用类构造函数?

MyObject* array = new MyObject[1000];

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

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

4 回答 4

6

C++ 等价于malloc分配函数operator new。你可以像这样使用它:

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

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

new (array + 0) MyObject();

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

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

std::unordered_map<int, MyObject> m;
m[100]; // Default construct MyObject with key 100
于 2013-05-01T10:19:52.997 回答
4

确实,使用 malloc 与 C++ 代码不太协调。但是 malloc 完全符合您的要求。因此,恐怕您所要求的与 C++ 也不是很和谐。我猜你只需要决定你更喜欢用 C 还是 C++ 编程的语言。

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

于 2013-05-01T10:18:04.877 回答
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();
于 2013-05-01T10:45:22.380 回答
0

你计时了吗?需要“太长时间”吗?这是否仅在程序执行时发生一次,例如在开始时?首先确定它实际上是一个问题。

真的需要这样分配1000个对象吗?

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

于 2013-05-01T10:45:43.403 回答