悬挂引用
问题:const std::string& 传入的如果是一个局部变量给一个全局变量会怎么样
如果将一个局部变量的const std::string &传递给一个全局变量,会发生什么?
这属于悬挂引用(dangling reference)的情况。
当局部变量离开作用域后,其内存会被释放,而全局变量仍持有这个引用,导致访问无效内存,这是非常危险的。
举例
例如:
1 | cpp |
在foo()函数中,str是一个局部变量,当foo()调用结束后,str所占用的内存会被释放。
但是全局变量global_ref却持有str的一个const引用,这会导致global_ref访问的内存不是原来的”hello”字符串,而是其他的无效内存。
这属于非常严重的程序缺陷,运行时行为是未定义的,可能产生致命错误。
正确的做法是不要传递局部变量的引用给全局范围,有几种解决方案:
1.不传递引用,传递实值的副本
1 | cpp |
2.如果必须传递引用,传递堆上创建的字符串对象的引用
1 | cpp |
3.不将引用传递给全局域,只在局部域使用
1 | cpp |
总结
所以,总结来说,不要将局部变量的引用传递给全局域,这会产生悬挂引用导致未定义行为。
如果需要传递引用,只在局部域使用,或者传递堆上对象的引用。传递实值拷贝也是一种简单可靠的选择。
这样可以确保程序的正确性,避免产生悬挂引用等危险情况。