繁体   English   中英

动态分配对象数组失败

[英]Dynamically allocating an array of objects fails

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

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

而且我还可以创建Data类型的对象,如下所示:

Data one(12,12);

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

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

但这不起作用...

另外,如果您能告诉我如何使散列适用于c ++,那将很棒。 我一直在寻找示例,但是所有内容都只说#include“ hash_map”,但是当我尝试使用该库时,似乎找不到任何示例。

#include <vector>

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

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

#include <vector>

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

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

Data* arr = new Data[len];的最可能原因之一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]初始化指向其第一个元素的指针,并以与动态分配数组相同的方式使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM