首页 > 解决方案 > 何时通过 T*& p 而不是 T* p?

问题描述

我想了解传递和何时使用一个而不是另一个之间的*&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++pointersreference

解决方案


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

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

传递指针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);

推荐阅读