【问题标题】:Constructor of objects in heap array [duplicate]堆数组中对象的构造函数[重复]
【发布时间】:2019-03-22 00:41:39
【问题描述】:

所以,我有一个带有构造函数的对象。此对象不支持空构造函数,因为必须在构造函数中分配常量。像这样的:

class Object {
public:
    const int foo;

    Object(int f) : foo(f) {
        // other stuff
    }
}

现在我有另一个函数来保存动态分配的对象数组。

Object* objects;

我需要能够使用new[]delete[] 分配此内存,但也需要使用构造函数。我似乎无法弄清楚如何做到这一点。

这样的东西会很理想

objects = new Object[numObjects];
for (int i = 0; i < numObjects; ++i) {
    object[i](foos[i]);
}

我可以使用mallocfree,然后使用new 对象,但这并不理想,因为我必须遍历析构函数中的对象并手动销毁它们,然后释放内存.看起来很乱。

【问题讨论】:

  • 尝试将常量设为静态。
  • 使用std::vector,您将能够做到这一点。
  • @Gardener 对象之间的常量不同。
  • @Phil1970 我正在努力保持实现紧凑、快速和低内存。

标签: c++ c++11 pointers constructor


【解决方案1】:

你可以使用列表初始化:

objects = new Object[3]{1, 2, 3};

但这仅适用于恒定大小的数组。

我可以使用 malloc 和 free,然后新建对象

这确实是创建包含非默认可构造类型对象的动态长度数组的方法。除了 malloc 之外,使用 new[] 分配 std::byte 的数组会更惯用。这也是如何分配您以后要创建的特定数量对象的数组。

但是没有必要自己写,因为标准库为你提供了std::vector,它会为你做这个:

std::vector<Object> mycars(numObjects, Object(42));

【讨论】:

  • 为了速度和内存,我不想使用 std::vector。我可能会选择malloc。也许我会对这两种实现进行一些基准测试,看看我得到了什么。谢谢!
猜你喜欢
  • 2020-07-27
  • 1970-01-01
  • 2021-03-02
  • 2018-05-09
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 2021-06-04
相关资源
最近更新 更多