2013-05-01 112 views
5

我一直在寻找,但无法找到答案。有没有办法告诉new运营商不能拨打的类构造函数?C++未初始化的类实例数组

MyObject* array = new MyObject[1000]; 

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

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

回答

4

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

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

然后,您可以建立一个特定的对象定位放置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 
+0

感谢您的回答。在static_cast上使用C风格的任何缺点?构造语法对我来说是新的。速度是关键,我不认为地图适合,因为我真的需要一个固定数量的元素的线性阵列。 – 2013-05-01 11:29:56

+0

@尼克拉斯在这种情况下,没有任何缺点。 C风格转换被定义为将成功的一组转换中的第一个转换。在这种情况下,它将相当于一个'static_cast'。但是,我更喜欢明确。另外,关于放置新语法的Stack Overflow有很多信息。 – 2013-05-01 11:33:38

+0

@NiklasR只是为了确保:你想创建对象顺序(从索引0开始)或在数组中的任意位置?如果你想要它们顺序,那么慢的'std :: vector'答案是适当的。 – 2013-05-01 11:54:36

4

实际上,使用malloc与C++代码并不是很和谐。但malloc完全按照你的要求。所以,我担心你要求的与C++不太一样。我想你只需要决定你想用C或C++编程的语言。

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

3

只是使用std :: vector的

std::vector<MyObject> v; 

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

进行随机访问(这是(基本上)什么的std ::矢量内部一样):

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(); 
0

你已经超时了吗?这是否需要“太久”?这只会在执行程序时出现一次,就像在开始时一样?首先确定它实际上是一个问题。

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

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

+0

这不是一个有用的答案。是的,我已经确定它实际上*是一个问题。如有可能,应减少任何开销。 – 2013-05-01 11:22:58

+3

没问题。这不是由其他评论者提出的,你没有在你的问题中提及,所以我认为这是一个相关的角度。现在我看到sftrabbit问“我是否真的想自己做这个动态分配”,这与我的第二条评论类似。 – codah 2013-05-01 20:58:37