为什么c ++引用被认为比指针更安全?

yas*_*ser 9 c++ pointers reference

当c ++编译器为引用和指针生成非常相似的汇编代码时,为什么使用引用优先(并且认为比指针更安全)?

我确实看到了

编辑-1:

我正在查看g ++为这个小程序生成的汇编程序代码:

int main(int argc, char* argv[])
{
  int a;
  int &ra = a;
  int *pa = &a;
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 18

它被认为更安全,因为很多人"听到"它更安全,然后告诉别人,他们现在也"听到"它更安全.

没有一个人理解参考文献会告诉你他们比指针更安全,他们有相同的缺陷和潜在的无效.

例如

#include <vector>

int main(void)
{
    std::vector<int> v;
    v.resize(1);

    int& r = v[0];
    r = 5; // ok, reference is valid

    v.resize(1000);
    r = 6; // BOOM!;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:由于似乎有一些关于引用是对象的别名还是绑定到内存位置的混淆,这里是标准(草案3225,部分[basic.life])中的段落,其中明确指出引用绑定到存储并且可以寿命创建引用时存在的对象:

如果在对象的生命周期结束之后并且在重用或释放对象占用的存储之前,则在原始对象占用的存储位置创建新对象,指向原始对象的指针,引用引用原始对象,或者原始对象的名称将自动引用新对象,并且一旦新对象的生命周期开始,就可以用来操纵新对象,如果:

  • 新对象的存储完全覆盖原始对象占用的存储位置,以及
  • 新对象与原始对象的类型相同(忽略顶级cv-quali firs),以及
  • 原始对象的类型不是const-quali fi ed,如果是类类型,则不包含任何类型为const-quali fi ed或引用类型的非静态数据成员,以及
  • 原始对象是类型最派生的对象,T新对象是类型最派生的对象T(也就是说,它们不是基类子对象).

  • "没有一个人理解参考文献会告诉你他们比指针更安全"--->我理解他们(因为我确信其他人也这样做)而且我仍然说他们更安全.请注意,"更安全"不*意味着"安全"......你仍然可以用脚射击自己,这只是更难. (5认同)
  • +1只是为了这个:"它被认为更安全,因为很多人"听到"它更安全,然后告诉别人,他们现在也"听到"它更安全." (3认同)

Lig*_*ica 7

这取决于你如何定义"更安全".

编译器不允许您创建未初始化的引用,或者指向NULL的引用,并且在您使用它时,它不会让您意外地将引用引用到其他地方.这些更严格的规则也意味着您的编译器可以为您提供有关常见错误的更多警告,而使用指针则无法确定您是否打算做您所做或不做的事情.

另一方面,语法的透明度 - 即亚历山大C.提到的在调用网站上传递参数作为参考的内容 - 使得很容易没有意识到你正在传递一个参考.因此,您可能没有意识到您应该维护参数的所有权和生命周期,或者您的参数可能会被永久修改.

  • 我只是说它不是使用引用的唯一好处,你可以从指针获得相同的行为(通过声明它为const). (2认同)

Meh*_*dad 6

因为引用(它只是其他变量的别名)不能按照NULL定义,提供固有的安全层.

  • 禁止NULL不会使引用安全.事实上,引用并不比指针更安全,并且间接隐藏的事实使它们更危险. (8认同)
  • @Alexandre C.:除非您之前调用了UB,否则它们不能为NULL,此时所有的投注都会关闭,因此它不是引用的错误.:) (4认同)
  • @Ben:不,有区别.这个*函数*(注意单位)保证可以工作:`void f(int&i){i = 0; 无论如何,每次都是这样.如果我有一个错误,我永远不需要考虑这个功能的原因.相反,这个函数*可以*break:`void f(int*i){*i = 0; 并且,将空指针传递给函数*是*面对错误时我需要考虑的事情.引用的是使我的函数自包含,并将函数放在函数的*user*上以处理他可能正确的任何指针. (3认同)
  • @Alexandre:它们可以创建为 null (取消引用指针),但最重要的一点是它们也可以引用垃圾。 (2认同)
  • @Matthie - 不,他们不能.取消引用NULL指针是UB.执行此操作的程序已经形成不良.因此,在那里学习的教训是不要取消引用无效或空指针. (2认同)