为什么引用比指针更安全?

3

嘿,我正在尝试理解指针和引用在使用安全性方面的区别。很多人说引用比指针更安全,因为它们不能为 null。但是对于以下代码,它表明引用可能会创建运行时错误,但指针不会:

class A {
public:
    A(): mAi(0) {}
    void ff() {std::cout << "This is A" << std::endl;}
    int mAi;
};

class B {
public:
    B() : mBi(0), mAp(NULL) {}
    A* getA() const { return mAp; }
    void ff(){std::cout << "This is B" << std::endl;}
    int mBi;
    A* mAp;
};

int main()
{
    B* b = new B();
    /// Reference part
    A& rA = *b->getA();
    rA.ff();
    std::cout << rA.mAi << std::endl;
    /// Pointer part
    A* pA = b->getA();
    if (NULL != pA)
    {
        pA->ff();
        std::cout << pA->mAi << std::endl;
    }
}

这段代码对于“引用部分”会崩溃,但对于“指针部分”不会。

  1. 为什么我们总是说引用比指针更安全,如果它们可能无效(如上述代码)而且我们无法检查它们的无效性?

  2. 在使用指针或引用时,是否存在RAM或CPU消耗方面的差异?(当我们可以使用引用时,是否值得重构大型代码以使用引用而不是指针?)

1个回答

3

参考文献不能为NULL,这是正确的。但是,您代码中的引用部分崩溃了,因为当您尝试初始化引用时,您明确地尝试取消引用NULL指针,而不是因为引用曾经是null

*b->getA(); // Equivalent to *((A*) NULL)

如果你做了以下操作,引用可能会变成悬空引用:

int* a = new int(5);
int& b = *a;

// Some time later
delete a;

int c = b + 2; // Ack! Dangling reference

使用指针并不能在这里帮助你,这是一个等效的使用指针的代码:

int* a = new int(5);
int* b = a;

// Some time later
delete a;

if(b) { // b is still set to whatever memory a pointed to!
    int c = *b + 2; // Ack! Pointer used after delete!
}

指针和引用在性能方面不太可能产生任何差异,它们在底层实现上可能根据您的编译器而有所不同。如果编译器可以准确地确定引用绑定到什么,那么引用可能会被完全优化掉。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接