我们公司有这个一段代码,后来看了高效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的特性,需要显示的指明被引用的对象是编译时就可以确定内存地址的。