V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
iqoo
V2EX  ›  程序员

C++ 中引用指针指向的变量会有问题吗?

  •  
  •   iqoo · 2023-02-03 14:40:27 +08:00 · 1156 次点击
    这是一个创建于 684 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如下伪代码,现实中 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 。但引用可以用 . 而不是 -> 看着更舒服些,不知有没有问题。

    7 条回复    2023-02-03 16:39:34 +08:00
    darer
        1
    darer  
       2023-02-03 14:43:40 +08:00 via Android
    如果 ptr 是 null 那你创建 obj 的时候就 crash 了
    tool2d
        2
    tool2d  
       2023-02-03 14:54:31 +08:00
    用引用替代指针,不算是个好习惯。

    如果你后续行有这种 obj = *ptr2; 会覆盖原值,且不太好调试,直接就现场翻车了。
    blinue
        3
    blinue  
       2023-02-03 15:04:29 +08:00
    我经常用引用代替指针,没什么问题。至于 ptr 是否是 null ,要明确场景的前置条件。如果确定是非空的,就 assert ,否则 if
    cnbatch
        4
    cnbatch  
       2023-02-03 15:04:41 +08:00
    malloc 获得的指针在解引用之前都应当先判断是否为 nullptr 。

    不过既然你确定不为 nullptr ,那么单纯就谈这段代码的话,没问题,随便用,只要最后别忘了释放掉。
    kice
        5
    kice  
       2023-02-03 15:19:40 +08:00 via Android
    这个用法没有问题,重构时我经常使用这个办法。不过不要一会 obj.a 一会 ptr->a 。

    其实看编译出来的二进制,转成引用之后实际上二进制没有变化。编译到汇编之后,除非能塞到寄存器里面,其实都是类 /结构体都是指针。

    至于 @darer 说的创建 obj 时会 crash 是不会的,只有下面访问 /赋值 obj 里面的成员才会。检查 nullptr 必须要有。


    既然是 c 艹了,如果能避免直接使用指针还是避免得好。对象的生命周期可以依赖 RAII 机制,不用自己分配和释放内存。
    antonius
        6
    antonius  
       2023-02-03 16:29:33 +08:00
    没啥问题吧,自己别搞错,保持代码风格一致。
    junmoxiao
        7
    junmoxiao  
       2023-02-03 16:39:34 +08:00
    可以但没必要
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4896 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:47 · PVG 17:47 · LAX 01:47 · JFK 04:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.