动态分配对象数组失败

时间:2013-02-18 00:44:58

标签: c++ arrays dynamic-memory-allocation default-constructor

我能够创建一个动态大小的整数数组,如下所示:

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

我也可以像这样创建Data类型的对象:

Data one(12,12);

现在我想要一个动态大小的Data数组:

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

但它不起作用......

另外,如果你能告诉我如何为c ++工作哈希会很棒。我一直在寻找示例,但是所有内容都只是说#include“hash_map”但是当我尝试使用它时,它似乎无法找到它们中的任何一个。

3 个答案:

答案 0 :(得分:2)

#include <vector>

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

答案 1 :(得分:1)

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

#include <vector>

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

编辑:BTW是否有可能L2或甚至B2值可能是0

答案 2 :(得分: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]初始化指向其第一个元素的指针,并以与使用动态分配的数组相同的方式使用它。

相关问题