您当前位置: 首页 » 未分类 » 满街尽是地雷阵,不要随便乱用“&”引用

满街尽是地雷阵,不要随便乱用“&”引用

2013-10-31 |

我们公司有这个一段代码,后来看了高效c++之后就总感觉有问题。不试不知道,一试全是地雷阵。

 

一般会写这么一个函数,返回的是引用。这样也符合C++里面的一些思想。但如果这样的函数没有用好的话,留下的就是一个地雷


std::vector<int>& Return_null_reference()
{

.....

}

例如有如下代码


std::vector<int>& Return_null_reference()
{
 std::vector<int> *pTmp = NULL;

return *pTmp;
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{

std::vector<int> *pTmp1 = NULL;
 pTmp1 = &Return_null_reference();

std::vector<int> &pTmp2 = Return_null_reference();

Sleep(1);
 }

我在vs 2008 sp1中编译不但能够通过,而且不会报错。执行的结果就是,ptmp1指向了一个空指针,ptmp2引用了一个空指针。

这里实际上看上去ptmp2会有问题,因为在引用的变量定义时,需要在编译器就要确定引用的对象是一个非NULL地址。但事实上这里因为引用了一个函数的返回,由于函数的返回值是属于运行时问题,所以编译器不做检查。于是就留下了一个坑。

高效C++中说过,不要随便引用一个指针指向的对象,因为有可能那个指针是指向NULL。

同时也隐约讲过引用不的不当反而比指针会更危险。

要利用编译器检查引用非NULL的特性,需要显示的指明被引用的对象是编译时就可以确定内存地址的。

分类:

未分类

| 标签: