如何在C创建的指针数组++(How to create array of pointers in C

2019-09-29 01:17发布

在类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];
}

Answer 1:

一般来说,你不应该推倒重来。 原始阵列几乎总是错的路要走。 看一看从STL的各种容器,即std::vectorstd::list 。 我woud想在你的情况下std::vector可能是最好的解决方案。

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

此外,当前的代码缺少析构函数delete[]再次节点列表。 这正是为什么推荐使用标准集装箱的:他们有析构函数,将做的工作适合你。



Answer 2:

好吧,如果你坚持,但答案既不是最好的,也不是最简单的,和正确性是非常多的负担了。

对于构造函数,使用基本初始化列表:

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

我们还做numchild一个无符号的类型,因为它代表了一个尺寸。

但现在你也必须照顾到解除分配上破坏内存。 一个简单的delete[]不会做,因为你首先要遍历所有的孩子,递归解除分配他们的记忆。

总而言之,共享指针的载体将节省你的代码的约90%。



文章来源: How to create array of pointers in C++