节点n和新节点之间的差异

时间:2013-02-10 08:31:11

标签: c++

如果我在C ++中声明一个struct节点,之后我声明:

n = new node;

node n;

这两个符号是否代表相同的东西?

3 个答案:

答案 0 :(得分:3)

没有

n = new Node;

是一个指针,正确的代码是

Node* n = new Node;

或者,C++11(2011年发布的最新C ++标准,蚂蚁尚未由多个编译器实现,即使最新的GCC 4.7或即将发布的4.8非常接近)

auto n = new Node;

实际上,使用上面的原始指针是不受欢迎的。您应该考虑使用smart pointers,例如

std::shared_ptr<Node> n = new Node;

指向的节点将在稍后调用(可能是间接的)

时被销毁
delete n;

(请注意智能指针为你“神奇地”做到了这一点)

但是

Node n;

声明类型为Node的变量。 Node数据在当前范围结束时(即在包含括号的结束}处)被销毁。

另请阅读RAII

答案 1 :(得分:2)

  1. node* n = new node;在堆上分配
  2. node n;在堆栈上分配
  3. 在案例1中。当您使用new关键字在堆上分配时,必须使用node*,因为您要保存指向对象的指针而不是对象本身。当您想要使用当前范围之外的对象时,使用堆分配尤其有用,尽管您必须始终记住在使用delete n;关键字分配的每个对象上调用new(除非您'重新使用std::shared_ptr或其他任何内容。)

    node* make_node()
    {
        node* n = new node;
        n->do_something();
        return n;
    } // node n does not go out of scope here, but you'll have to call delete on it when you're done
    

    在案例2中。对象是在堆栈上分配的,而你不必在这里调用delete,这个会在结束时超出范围当前块:

    void function()
    {
        node n;
        n.do_something();
    } // node n goes out of scope here.
    

    有关std::shared_ptr和其他<memory> goodies的其他信息。

答案 2 :(得分:1)

虽然它们代表相同的东西,但第二种情况下的n是在堆栈上创建的,其中n中的n = new node;是在堆存储上创建的,必须手动创建delete d。

此外,n中的n = new node必须是指针,如下所示:node* n;

相关问题