【问题标题】:Dynamically allocating an array of objects fails动态分配对象数组失败
【发布时间】:2013-02-02 09:19:55
【问题描述】:

我可以像这样创建一个动态大小的整数数组:

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

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

Data one(12,12);

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

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

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

另外,如果您能告诉我如何让哈希值适用于 c++,那就太好了。我一直在寻找示例,但所有内容都只是说 #include "hash_map" 但是当我尝试使用该库时,它似乎找不到任何示例。

【问题讨论】:

  • 它是如何“不工作”的?
  • 我怀疑你的类没有默认构造函数?哦,至于哈希映射,如果您可以使用 C++11,请使用 std::unordered_map。
  • 您是否有不能使用 STL 的原因?
  • 为什么不对 VLA 使用 std::vector 而对哈希使用 std::map 呢?
  • @Adam27X:注意std::map 不是哈希表。您可能想阅读Why is std::map implemented as red-black tree?

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


【解决方案1】:
#include <vector>

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

【讨论】:

  • 值得注意的是,emplace_back 是 C++11 的特性。 C++03 替换可能是v.push_back(Data(12,12));。
【解决方案2】:

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

#include <vector>

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

编辑:顺便说一句,L2 甚至 B2 值是否有可能是0?

【讨论】:

  • 我怀疑如果 OP 的示例“不起作用”,那么这个也不起作用。
【解决方案3】:

Data* arr = new Data[len]; 不起作用的最可能原因之一是因为类型 Data 没有默认构造函数,即Data::Data()。

但是不管Data是否有默认构造函数,无论如何尝试创建这样的数组都不是一个好主意。一旦您使用new[] 动态分配它,您就承诺自己处理丑陋的内存管理与它连接。最好使用 STL 容器之一,例如 std::vector(需要#include &lt;vector&gt;),它会为您处理内存管理。

那么你有几个选择:

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 对象创建自动存储持续时间。请注意,所有元素都存储在连续的内存块中,因此您可以使用&amp;v[0] 来初始化指向其第一个元素的指针,并以与动态分配数组相同的方式使用它。

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 2021-03-17
    • 2012-05-04
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多