-2

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

n = new node;

或者

node n;

这两个符号代表同一个东西吗?

4

3 回答 3

3

不。

n = new Node;

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

Node* n = new Node;

或者,使用C++11(2011 年发布的最新 C++ 标准,ant 尚未被多个编译器实现,即使最新的 GCC 4.7 或即将发布的 4.8 已经很近了)

auto n = new Node;

实际上,不赞成使用像上面这样的原始指针。您应该考虑使用智能指针,例如

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

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

delete n;

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

Node n;

声明一个类型的变量Node。该Node数据在当前范围的末尾被销毁(即在}包含大括号的右括号处)。

另请阅读有关RAII的信息。

于 2013-02-10T08:34:18.950 回答
2
  1. node* n = new node;在堆上分配
  2. node n;在堆栈上分配

情况 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> 好东西的附加信息。

于 2013-02-10T08:33:12.073 回答
1

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

此外,ninn = new node必须是一个指针,像这样创建:node* n;

于 2013-02-10T08:33:05.193 回答