CPP - 使用*或&返回地址

时间:2015-03-27 20:11:28

标签: c++ visual-studio-2010 pointers visual-c++ reference

我正在编写一个代码来制作链表。 为了在主函数中使链表更容易,我编写的函数之一是[node是一个struct的名称,接下来是a.data b.pointer name):

    node& create_node(int value)
    {
    node newitem;
    newitem.data=value;
    newitem.next=NULL;
    return (newitem);
    };

当我写这样的函数时,一切都还可以,但我想把函数头写为:

    node * create_node(int value)

但是当我这样写的时候我写了

  return *newitem;

我收到错误。 我想问为什么VS在第二种方式中向我显示错误,使用*和&的区别是什么? [我已经在这里阅读了有关参考资料的内容,但我不明白为什么人们应该在函数中使用它,因为从我所理解的使用引用需要额外的空间而没有贡献]。

编辑:谢谢你的帮助,当我发布它之前,我甚至在主函数上运行测试之前只是试图避免编译前的错误。 我花了一些时间,但现在我看到了我犯的根本错误。

3 个答案:

答案 0 :(得分:2)

如果要返回指针,则应使用指针:

node* create_node(int value)
{
    node *newitem = new node;
    newitem->data = value;
    newitem->next = NULL;
    return newitem;
};

另外请考虑谁将删除该对象。

答案 1 :(得分:1)

您的代码返回对变量的引用。

不幸的是,您返回对局部变量的引用。这将失败,因为局部变量将在uppont返回时被销毁,但调用者仍将尝试引用它(即UB)!

因此,如果要返回引用,则应确保该对象仍然存在:

node& create_node(int value) { 
    node* newitem = new node;
    newitem->data=value;
    newitem->next=NULL;
    return (*newitem);  // return the objet: this will be then be converted to a reference
}

您也可以按照其他答案的建议使用指针。但是在这种情况下,我会选择shared_ptr

shared_ptr<node> create_node(int value) { 
    node* newitem = new node;
    newitem->data=value;
    newitem->next=NULL;
    return (shared_ptr<node>(newitem)); 
}

答案 2 :(得分:1)

你应该返回&amp; newitem。

但鉴于你的newitem只在这个函数的作用域中可用,返回的指针将指向一个被破坏的对象,所以“什么都没有”,或者说它会导致未定义的行为。

我想你想要动态创建你的newitem。

node * create_node(int value)
{
    node * newitem = new node;
    newitem->data=value;
    newitem->next=NULL;
    return newitem;
};