如果我在 C++ 中声明一个结构节点,之后我声明:
n = new node;
或者
node n;
这两个符号代表同一个东西吗?
不。
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的信息。
node* n = new node;
在堆上分配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>
好东西的附加信息。
虽然它们代表相同的东西,n
但在第二种情况下是在堆栈上创建的,而n
inn = new node;
是在堆存储上创建的,必须手动delete
d.
此外,n
inn = new node
必须是一个指针,像这样创建:node* n;