返回局部对象的引用和返回局部对象的指针
来源:互联网 发布:游戏宣传片制作软件 编辑:程序博客网 时间:2024/06/05 10:55
在C++ primer书中有这么一句话,“千万别返回局部对象的引用”与“千万别返回局部对象的指针”,为什么会有这种说法呢?以下就为大家讲解一下:
1.返回局部对象的引用
string & opp(const string & name)
{
string s;
s = name;
return s;
}
2.返回局部对象的指针
string * opp(const string * name)
{
string * s;
*s = *name;
reutnr s;
}
要想理解这个首先我们要知道,函数在内存的运行机制。
每当一个函数被调用的时候,系统都会将其参数和变量保存在内存的一个区域,此区域是一个栈(stack)的结构,其中的元素按后进先出(last-in first-out)的方式存取;当一个函数调用另一个函数时调用者的栈空间被完好无缺地保留,系统会分配新的空间来处理新的函数调用。当一个函数完成它的工作,返回其调用者时,它关联的栈空间将被释放。
局部对象的内存地址已经被释放了,如果这时又有新创建的函数栈,那么就会覆盖原有的局部对象,然后就会出错。
也就是说,函数调用完之后,会销毁临时对象,返回引用或者指针会导致未定义的行为,无法指向局部对象的指针,返回局部对象的指针的唯一办法就是创建动态对象,关键字new,能在内存里创建新的空间(不同于函数的栈空间),处于堆中,除了用关键字delete来销毁。
一般而言引用,在类类型用的广泛,对于class a& fun()而言,返回引用就非常有用了,避免了对象的复制,对象复制牵扯到复试构造器,而复制构造器又跟基础有联系,继承再加上virtual,一系列的这些联系中,一个隐藏的及其不易发现的bug就有可能出现。所以,此时用返回引用就非常有用,但是,返回的不是局部变量的引用,而是new出来的对象的引用。如
重载操作符
ofstream & operater+(const string& s, const string& t)
{
return s + t;
}
调用:
string a("asd");
string b("asdsd");
cout << operater+(a, b);
- 返回局部对象的引用和返回局部对象的指针
- 不要返回局部对象的引用或指针
- 关于函数不能返回局部对象的引用或者局部对象的指针
- c++返回函数局部对象的引用
- 不要返回局部对象的引用
- c++返回函数局部对象的引用
- 不能返回局部对象的引用
- 返回局部对象的引用,返回函数内部用new初始化的指针的引用
- 为什么C++中千万不要返回局部对象或变量的引用和指针
- 为什么C++中千万不要返回局部对象或变量的引用和指针
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用
- 不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用
- effective c++ ------不要返回指向局部对象指针或引用,该返回对象就返回对象.
- 返回函数局部变量的指针和引用
- 为什么不能返回局部对象的应用
- C++ 返回局部对象的值
- 返回局部变量的引用
- jndi详解
- Android面试之---谈谈你对Android NDK的理解
- JSP内置对象之--response登录验证
- Android 下载安装APK
- mfc绘图 结构与函数大全
- 返回局部对象的引用和返回局部对象的指针
- Spring Security学习笔记
- Android面试之----谈谈你对Java中Native关键字的认识!
- 初识Socket之构造接受包的简易程序(C语言实习)
- 查看SAP HANA DB 和SAP HANA studio的版本
- 通过json自定义extjs 消息框
- Java异常处理机制
- Myeclipse中jsp调整字体大小
- 一年,今日