【问题标题】:CPP - using * or & to return addressCPP - 使用 * 或 and 来返回地址
【发布时间】:2015-03-27 20:11:27
【问题描述】:

我正在编写一个代码来制作一个链表。 我为了使主函数中的链表更容易而编写的函数之一是[node is the name of a struct contains a.data b.pointer name next):

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

当我像这样编写函数时,一切正常,但我想将函数头写为:

    node * create_node(int value)

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

  return *newitem;

我得到一个错误。 我想问一下为什么 VS 以第二种方式向我显示错误以及使用 * 和 & 之间有什么区别理解使用引用需要额外的空间而不是贡献]。

编辑:感谢您的帮助,当我发布此内容时,我什至还没有对 main 函数进行测试,只是试图避免编译前的错误。 我花了一些时间,但现在我看到了我犯的根本错误。

【问题讨论】:

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


【解决方案1】:

如果你想返回一个指针,你应该使用一个指针:

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

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

【讨论】:

  • 您不应该推荐原始内存分配。
【解决方案2】:

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

不幸的是,您返回了对局部变量的引用。这将失败,因为局部变量将在返回时被销毁,但调用者仍会尝试引用它(即 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)); 
}

【讨论】:

    【解决方案3】:

    你应该返回 &newitem。

    但鉴于您的 newitem 仅在此函数的范围内可用,返回的指针将指向已销毁的对象,因此“无”,或者更确切地说,它会导致未定义的行为。

    我猜你希望你的新项目是动态创建的。

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

    【讨论】:

    • 您不应该推荐原始内存分配。
    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多