【问题标题】:Allocating Array of Pointers on Heap在堆上分配指针数组
【发布时间】:2017-11-14 18:56:40
【问题描述】:

以下是创建 x 个新对象,还是只是为 x 个对象分配空间?:

Vector3D* binArray = new Vector3D[size];

我需要在堆上为 x Vector3D 对象构建一个具有空间的数组。但是,只有在调用“add”函数时才能创建 Vector3D 对象 - 这将获取参数,在堆上构造对象并将其地址添加到 Vector3D 指针数组。

【问题讨论】:

  • 你调用了 new - 这意味着你将调用构造函数。
  • 使用 std::vector!

标签: c++ arrays heap-memory


【解决方案1】:

这确实在堆上创建了一个 Vector3D 对象数组。

每个向量都是通过调用 Vector3D 构造函数来创建的。

在 Vector3D 的默认构造函数中放置一点调试打印语句,并观察构造函数被调用的次数与数组中向量的次数相同。

例子:

#include <iostream>
using namespace std;

class C {
public:
  C() { cout << "Hello default constructor here\n"; }
};

int main() {
  C* cs = new C[5];
}

输出是:

Hello default constructor here
Hello default constructor here
Hello default constructor here
Hello default constructor here
Hello default constructor here

如果您的类没有默认构造函数,则无法一次性分配数组(感谢@Everyone 的评论),因此在这种情况下,请考虑使用std::vector 或std::array 并添加您的Vector3D动态对象——甚至“静态”!示例:

#include <iostream>
#include <vector>
using namespace std;

class Vector3D {
  double i, j, k;
public:
  Vector3D(double i, double j, double k): i(i), j(j), k(k) {}
};

int main() {
  vector<Vector3D> v = {
    Vector3D(3, 4, 5),
    Vector3D(6, 8, 10),
    Vector3D(7, 24, 25)
  };
  v.push_back(Vector3D(1, 2, 3));
  cout << v.size() << '\n';
}

这会输出 4。

您还可以使向量包含指向 Vector3D 对象的指针。

【讨论】:

  • 我认为值得注意的是,如果他没有默认构造函数,这将无法工作。只是为了完成。
  • 那么,我怎样才能将 Vector3D 对象数组(大小为 x)作为私有成员,然后分别动态构造和分配每个对象。
  • 您想要一个数组作为成员,但您希望数组的每个成员都在堆上?我认为我所做的最后一次编辑应该会有所帮助,但老实说,将 Vector3D 对象直接存储在数组、std::array 或 std::vector 中我认为会很容易。你能澄清一下(1)你的数组的大小是事先知道的吗? (2) Vector3D 对象必须在堆上还是可以按值分配?
  • @Edward 使用 std::vector
  • @pm100,这是一个学习练习,我们被告知不要使用它。
【解决方案2】:

只是根据提问者对 RayToal 的出色答案的 cmets 添加。如果您在运行前不知道binArray 的大小,那么您必须使用std::vector。如果你想单独分配每个项目,我建议使用std::vector&lt;Vector3D*&gt;。

这样您可以在运行时调整std::vector 的大小,当您这样做时,它将保存一堆未分配的nullptrs。然后,您可以分别分配它们中的每一个。

std::vector<Vector3D*> binArray;
binArray.resize(x);  // now you have binArray of size x and no allocated elements
binArray[0] = new Vector3D(...);

请记住,您需要在不使用它们后将其删除,以免发生内存泄漏:

for(size_t i=0;i<binArray.size(); i++)
  if(binArray[i]!=nullptr) delete binArray[i];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-19
    • 2015-04-16
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2015-08-05
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多