如何在C++中创建指针数组

How to create array of pointers in C++

本文关键字:创建 指针 数组 C++      更新时间:2023-10-16

在类别Node:中

class Node {
public:
    int data;
    int numchild;  
    Node** nodelist;
    Node(int data, int s);
};

我想要一个指向其他节点的指针数组(nodelist),这些节点具有来自该节点的边。

以下构造这样一个数组的方法(以及上面声明它的方法)是正确的、最好的(或最简单的)方法吗?如果没有,为什么以及最好的方法是什么?

Node::Node(int d, int s) {
    data = d;
    numchild = s;
    nodelist = new Node*[s];
}

一般来说,您不应该重新发明轮子。原始数组几乎总是错误的。查看STL中的各种容器,即std::vectorstd::list。我想在你的情况下,std::vector可能是最好的解决方案。

如果你想坚持使用原始数组,一个快速警告:new Node*[s]不会初始化数组,所以内容将是未定义的。但是,如果添加一组括号(new Node*[s]()),它将被初始化为零,这是一件好事,因为它可以帮助您发现哪些条目已经填充。

此外,您当前的代码再次缺少delete[]节点列表的析构函数。这正是建议使用标准容器的原因:它们有析构函数,可以为您完成工作。

好吧,如果你坚持的话,但答案既不是最好的,也不是最简单的,正确性现在在很大程度上是你的负担。

对于构造函数,使用基本初始值设定项列表:

Node::Node(int d, size_t s)
: data(d), numchild(s), nodelist(new Node*[s])
{
}

我们还将numchild设为无符号类型,因为它表示大小。

但现在你也必须小心在销毁时释放内存。一个简单的delete[]是做不到的,因为你首先必须遍历所有的子级并递归地释放它们的内存。

总而言之,一个共享指针向量可以节省大约90%的代码。