繁体   English   中英

在堆上分配指针数组

[英]Allocating Array of Pointers on Heap

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

Vector3D* binArray = new Vector3D[size];

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

这确实在堆上创建了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::vectorstd::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对象的指针。

只是根据提问者对RayToal出色答案的评论进行补充。 如果在运行时之前不知道binArray的大小,则必须使用std::vector 如果您想单独分配每个项目,我建议使用std::vector<Vector3D*>

这样,您可以在运行时调整std::vector大小,执行此操作时,它将容纳一堆未分配的nullptr 然后,您可以分别分配它们中的每一个。

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];

暂无
暂无

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

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