c++ - 何时通过 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
,它不再崩溃。
是因为分配新内存会改变指针的值吗?
如果是这样,总是通过*&
而不是更好和安全*
吗?
对此有什么一般规则吗?
解决方案
我想了解传递 *&p 和 *p 以及何时使用它们之间的区别。
您的目标是更改L
in的值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);
推荐阅读
- css - 如何获取 Tailwind 的内置 CSS Purge 以清除插件 CSS
- c# - 如何使用 LINQ 查询列表?
- sql - 在 SQL 表数据中检索直到某一点的记录
- javascript - 从 bcrypt 哈希函数中获取未定义的值
- javascript - 在 javascript 中加载经过训练的机器学习模型
- blockchain - 知道 BTC 地址背后是哪个交易所或钱包吗?
- html - HTML如何在精确的中心绘制带有大量数字的圆圈?
- android - 如何在android中动态增加EditText的大小?
- sql - Postregsql 根据列值将检索到的一条记录转换为两条记录
- javascript - 如何将括号内的逗号分隔字符串转换为Javascript中的数组?