如果我在C ++中声明一个struct节点,之后我声明:
n = new node;
或
node n;
这两个符号是否代表相同的东西?
答案 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)
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>
goodies的其他信息。
答案 2 :(得分:1)
虽然它们代表相同的东西,但第二种情况下的n
是在堆栈上创建的,其中n
中的n = new node;
是在堆存储上创建的,必须手动创建delete
d。
此外,n
中的n = new node
必须是指针,如下所示:node* n;