嘿我试图理解指针和参考之间的区别在于使用安全性,很多人说引用比指针更安全,它不能为空。但是对于下面的代码,它表明引用可能会产生运行时错误,但不会产生指针:
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;
}
}
此代码将因“参考部分”而崩溃,但不会因“指针部分”而崩溃。 我的问题是:
为什么我们总是说引用比指针更安全(如前面的代码中那样)并且我们无法检查它们的无效性?
使用Pointer或Reference之间的RAM或CPU消耗有何不同? (当我们可以的话,是否值得重构大代码以使用引用而不是指针?)
答案 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!
}
指针和引用不太可能产生任何性能差异,它们可能在引擎盖下类似地实现,具体取决于您的编译器。如果编译器可以确切地确定引用绑定的内容,则可以完全优化引用。