【问题标题】:When to pass T*& p instead of T* p?何时通过 T*& p 而不是 T* p?
【发布时间】:2018-06-27 03:58:33
【问题描述】:

我想了解传递*&p*p 之间的区别以及何时使用它们。

说,我有一个像下面这样的初始化函数。

void init(lua_State *L) {
    L = luaL_newstate(); //allocate new memory to L
}

如果我在main() 中尝试访问L,它会崩溃。

lua_State *L;
init(L);
do_something(L);//crash

但是,当我将参数类型更改为 lua_State *&L 时,它不再崩溃。

是因为分配新内存改变了指针的值吗?

如果是这样,总是使用*& 而不是* 传递不是更好更安全吗?

这有什么一般规则吗?

【问题讨论】:

标签: c++ pointers reference


【解决方案1】:

我想了解传递 *&p 和 *p 之间的区别,以及何时使用一个而不是另一个。

您的目标是更改initL 的值,并确保更改在调用函数中可见。

传递指向init 的指针不起作用,因为对参数的任何更改都只是局部更改。它不会改变调用函数中变量的值。因此,指针在main 中保持未初始化。在main 中使用未初始化的指针会导致未定义的行为,这表现为系统崩溃。

我建议将init 的参数类型更改为对指针的引用。当您这样做时,对参数的任何更改都将在调用函数中可见。

void init(lua_State*& L) {
    L = luaL_newstate(); //allocate new memory to L
    // The new value of L will be visible in the calling function.
}

并将其用作

lua_State *L;
init(L);
do_something(L);

关于更好的编码实践的建议 - 始终在声明时初始化您的自动变量。

lua_State* L = nullptr;
init(L);
do_something(L);

【讨论】:

  • @ZackLee 为避免此类崩溃,您始终可以这样做:if(L) do_something(L);。通过它您可以检查指针是否包含任何内容/已初始化。
  • @JeJo 仅在指针初始化时才有效。在 OP 的代码中,它不是,所以这种if 的行为将是未定义的
  • @RemyLebeau 是的。在检查之前我已经初始化了lua_State* L = nullptr;。忘记提了。谢谢。
【解决方案2】:

考虑一个变量int p,那么&p表示p的地址,最后*&p = p,p的值

现在考虑一个变量int *p,那么p指向p的地址,*p就是变量的值

【讨论】:

    猜你喜欢
    • 2014-01-03
    • 2020-11-27
    • 2010-12-09
    • 2017-06-15
    • 2016-09-25
    • 1970-01-01
    • 2023-03-19
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多