初学c++,有几个简单的问题一直困扰我,请大家过来看一下

allen830826 2004-07-31 01:37:51
看到论坛上很多人说,函数中不能返回一个临时变量的指针,不能返回一个临时变量的引用
对于函数中不能返回一个临时变量的指针,那么下面的程序是不是错误的呢?
int* test() {
int a = 10;
int* b = &a;
return b;
}
这在c语言里可是很常见的啊,教科书上就是这么写的,错了吗?

对于函数中不能返回一个临时变量的引用
我看到数据结构书上关于string类的定义求子串的函数这样写
string& substring(int pos,int len) {
string *temp = new string;
.....
return *temp;
}
这个也错了吗????

还有就是函数返回引用到底如何使用,用在什么地方
请具体给个例子(不要举操作符重载返回的引用,这个我已经理解了)
...全文
155 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yesdo 2004-07-31
  • 打赏
  • 举报
回复
楼上说的都没错。
函数中不能返回一个临时变量的指针,不能返回一个临时变量的引用
对于函数中不能返回一个临时变量的指针。
这一点你千万不要有任何怀疑,不要返回任何临时变量。

第2个是对的,就是没有delete掉堆空间,这是个老毛病,要改!
answerear(程式浪人) 说第二个是在内存的堆存储区分配空间,只有在程序结束时才释放空间。
是错误的,因为堆空间要人工手动的释放,程序结束并不会自动释放空间!
allen830826 2004-07-31
  • 打赏
  • 举报
回复
明白了
多谢
answerear 2004-07-31
  • 打赏
  • 举报
回复
第一个肯定错啦。
a是函数执行时所分配的变量,当test执行完后,就释放掉了临时变量a,其内容已经没有意义了,返回的地址也没有意义了。

第二个是在内存的堆存储区分配空间,只有在程序结束时才释放空间。
erwinrommel 2004-07-31
  • 打赏
  • 举报
回复
简而言之就是new了就可以返回(用的时候注意大小即可,不能new了2个char,你却用到了a[2],那就越界了),没有new显然会清栈,当然不能返回~
renheihei 2004-07-31
  • 打赏
  • 举报
回复
mark
antijpn 2004-07-31
  • 打赏
  • 举报
回复
理论上,除了mallor或者operator new/new[]以外的其他函数都不应该出现这种返回指向在函数内分配的地址的指针。

假如你调用的不是operator new,而是operator new[],这样的话这个函数的调用者并不知道你在函数体内调用的是operator new还是operator new[],他释放分配的空间的时候自然也就不知道调用delete还是delete[]了。基于这种设计思路,C标准库里面的strcpy实现的时候就是要程序员显式传入指向缓冲区的指针。如果要解决这种设计上的问题,需要由函数的设计者定义一个另外的函数来释放内存,这样就有点像C标准库里面的malloc和free了,另外的解决方案就是用类封装,同样可以保证不产生内存泄漏之类的问题。
allen830826 2004-07-31
  • 打赏
  • 举报
回复
那第二个例子是不是改为这样比较好
string* substring(int pos,int len) {
string *temp = new string;
.....
return temp;
}
lifanxi 2004-07-31
  • 打赏
  • 举报
回复
楼上讲的不错!
第一个例子肯定不对,在C里也同样是错的,不知哪本教材这么不负责任。
函数返回指针的地方基本上都可以改成返回引用,实际情况下用哪一种,要看这个函数使用的上下文的需要了,最常见的就是重载部分运算符时为了可以把运算符连接起来用,需要返回引用,这时如果改成返回指针,你的表达式写起来就很别扭了。
antijpn 2004-07-31
  • 打赏
  • 举报
回复
返回引用该怎么使用怎么使用,在不同需求下可以有不同的意义,不过最常见的可能是下面的这个例子:

class myclass
{
public:
myclass &func1(){return *this};
myclass &func2(){return *this};
}

myclass obj1;
obj1.func1().func2();
antijpn 2004-07-31
  • 打赏
  • 举报
回复
第一个例子当然是错的,函数test运行结束以后将会清栈,这样的话a就被咔嚓了,而返回的指针自然也是没有作用的了,搞不好还会造成运行时莫名其妙的问题。

第二个例子,这个已经不是临时变量了,而是程序员显式指定分配的一个string对象,这个对象在自由存贮区(一般情况下和堆是一个概念),清栈的时候不会清除这个对象,所以返回它的引用没问题。不过从语义上来说这个倒是不太正确,因为传出以后接受这个对象的是引用,不是指针,所以到时候容易让程序员误以为这个是一个栈内的对象,而不掉用delete操作符。这种风格的程序不值得提倡

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧