为什么参考比指针更安全?

时间:2017-07-15 02:35:25

标签: c++ pointers reference

嘿我试图理解指针和参考之间的区别在于使用安全性,很多人说引用比指针更安全,它不能为空。但是对于下面的代码,它表明引用可能会产生运行时错误,但不会产生指针:

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. 使用Pointer或Reference之间的RAM或CPU消耗有何不同? (当我们可以的话,是否值得重构大代码以使用引用而不是指针?)

1 个答案:

答案 0 :(得分: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!
}

指针和引用不太可能产生任何性能差异,它们可能在引擎盖下类似地实现,具体取决于您的编译器。如果编译器可以确切地确定引用绑定的内容,则可以完全优化引用。