
如下伪代码,现实中 ptr 是运行时动态获得的,并且确定不为 null 。
struct X { uint a; uint b; }; auto ptr = (X*) malloc(sizeof(X)); auto &obj = *ptr; obj.a = 11; cout << ptr->a << endl; // 11 ptr->a = 22; cout << obj.a << endl; // 22 正常使用应该是 ptr->a, ptr->b 。但引用可以用 . 而不是 -> 看着更舒服些,不知有没有问题。
1 darer 2023 年 2 月 3 日 via Android 如果 ptr 是 null 那你创建 obj 的时候就 crash 了 |
2 tool2d 2023 年 2 月 3 日 用引用替代指针,不算是个好习惯。 如果你后续行有这种 obj = *ptr2; 会覆盖原值,且不太好调试,直接就现场翻车了。 |
3 blinue 2023 年 2 月 3 日 我经常用引用代替指针,没什么问题。至于 ptr 是否是 null ,要明确场景的前置条件。如果确定是非空的,就 assert ,否则 if |
4 cnbatch 2023 年 2 月 3 日 malloc 获得的指针在解引用之前都应当先判断是否为 nullptr 。 不过既然你确定不为 nullptr ,那么单纯就谈这段代码的话,没问题,随便用,只要最后别忘了释放掉。 |
5 kice 2023 年 2 月 3 日 via Android 这个用法没有问题,重构时我经常使用这个办法。不过不要一会 obj.a 一会 ptr->a 。 其实看编译出来的二进制,转成引用之后实际上二进制没有变化。编译到汇编之后,除非能塞到寄存器里面,其实都是类 /结构体都是指针。 至于 @darer 说的创建 obj 时会 crash 是不会的,只有下面访问 /赋值 obj 里面的成员才会。检查 nullptr 必须要有。 既然是 c 艹了,如果能避免直接使用指针还是避免得好。对象的生命周期可以依赖 RAII 机制,不用自己分配和释放内存。 |
6 antonius 2023 年 2 月 3 日 没啥问题吧,自己别搞错,保持代码风格一致。 |
7 junmoxiao 2023 年 2 月 3 日 可以但没必要 |