2013-02-18 64 views
-1

我能够创建整数像这样的动态大小的数组:动态分配对象的数组失败

int *cacheL2 = new int[L2/B2]; 

,我还能够创建Data类型的对象是这样的:

Data one(12,12); 

,现在我想的Data动态大小的数组:

Data * vlaObj = new Data[L2/B2]; 

但它不起作用...

此外,如果你能告诉我如何获得散列工作的c + +将是伟大的。我正在寻找示例,但是所有内容都只是说#include“hash_map”,但是当我尝试使用该库时,似乎找不到它们中的任何一个。

+3

它如何“不起作用”? – juanchopanza 2013-02-18 00:47:01

+0

我怀疑你的类没有默认的构造函数?哦,至于散列图,如果你可以使用C++ 11,可以使用std :: unordered_map。 – Corbin 2013-02-18 00:47:19

+2

有没有理由不能使用STL? – Aesthete 2013-02-18 00:47:46

回答

2
#include <vector> 

// ... 
std::vector<Data> v; 
v.emplace_back(12, 12); 
+2

值得注意的是'emplace_back'是C++ 11的一个特性。 C++ 03替换可以是'v.push_back(Data(12,12));'。 – LihO 2013-02-18 00:58:13

1

这里没有理由不使用STL容器。建议使用std::vector而不是原始指针:

#include <vector> 

//... 
std::vector<Data> vlaObj(L2/B2); 
vlaObj.push_back(one) 

编辑:BTW是有任何机会,L2,甚至B2值可以是0

+1

我怀疑,如果OP的例子“没有工作”,这一个也不会工作。 – juanchopanza 2013-02-18 00:54:35

0

其中最可能的原因Data* arr = new Data[len];是行不通的,因为类型Data没有默认构造函数,即Data::Data()

但无论Data是否有默认的构造函数,不管怎么说,尝试创建一个这样的数组并不是一个好主意。一旦你用new[]动态分配它,你承诺自己照顾丑陋的内存管理连接它。使用其中一个STL容器(如std::vector#include <vector>必需))将为您处理内存管理更好。

这时你有几种选择:

std::vector<Data> v;     // option 1 
v.reserve(len); 
// in loop: 
    v.push_back(Data(x, y));   // there could be different values 

std::vector<Data> v2(len);    // option 2 

std::vector<Data> v3(len, Data(12,12)); // option 3 

第一种选择将适合几乎任何情况。它准备的内存块大到足以容纳len元素,然后您可以方便但仍然非常有效的方式填写v。选项2要求Data具有默认构造函数,该选项由使用自定义构造函数构造元素的选项3解决。

所有提到的选项都会导致std::vector对象创建自动存储持续时间。请注意,所有元素都存储在一个连续的内存块中,因此您可以使用&v[0]来初始化指向其第一个元素的指针,并以与您使用动态分配数组相同的方式使用它。