关于变量的生存期的问题。

高维橘子 2011-04-26 01:56:21
有两段程序,是《数据结构与算法分析 C++描述(第三版)》书中的例程。
书上说,第一个程序没有问题,但是第二段有问题。解释如下:

寻找最大值函数。 两者都试图按照常量引用返回值。第一个版本的findmax是可用的——表达式a[maxvalue]索引的vector是在findmax外部的,并且存在时间长于调用函数返回的时间。第二个版本是错误的,maxvalue是局部变量,当函数返回时就不复存在了。这样一来,没有进行复制之前就返回是不恰当的。如果编译器查出这个问题,那么返回值就可能是对的,也可能是错的。

不懂的地方在于:
maxindex和maxvalue这两个量本身都是局部变量吧,为什么在for循环执行完毕,maxindex还可以使用,而maxvalue就不可以使用了呢?二者都是在for循环之前定义并初始化,而且都在for循环内部修改值,为什么出了for循环后,maxindex还可以使用,maxvalue就不可以使用了呢?


const string & findmax ( const vector<string> & arr )
{
int maxindex = 0;

for ( int i=1; i<arr.size(); i++)
if ( arr [maxindex] < arr[i])
maxindex = i;

return arr[ maxindex ];
}



const string & findmaxwrong( const vector<string> & arr)
{
string maxvalue = arr[0];

for ( int i=1; i<arr.size(); i++)
if (maxvalue < arr[i])
maxvalue = arr[i];

return maxvalue;
}


...全文
200 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
herolijiang311 2011-04-26
  • 打赏
  • 举报
回复
++[Quote=引用 3 楼 youyulangzi 的回复:]
maxindex 和 maxvalue 都是局部变量都只在各自的函数体内有效。
但第一个函数返回的是一个外部的栈中的string,所以生命周期有效,
而第二个函数返回的是一个局部的string类型变量,在该函数返回以后,maxvalue所在内存的内容被清空,正如一楼所言,第二个函数返回的局部指针是访问不了的.
[/Quote]
  • 打赏
  • 举报
回复
#include <string>
#include <vector>
#include <iostream>

using namespace std;

const string & findmax ( const vector<string> arr )
{
int maxindex = 0;

for ( int i=1; i !=arr.size(); i++)
if ( arr [maxindex] < arr[i])
maxindex = i;

return arr[ maxindex ];
}

int main()
{
vector<string> svec;
svec.push_back("Hello");
svec.push_back("World");
cout << findmax(svec) << endl;
}
改成这样就悲剧了.

返回值引用的意思可能是引用对引用.
值对值
子达如何 2011-04-26
  • 打赏
  • 举报
回复
更正一下:
string findmaxwrong( const vector<string> & arr)
子达如何 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]

int型会执行复制,string类型是特殊类型,它其实访问的是指针,局部指针执行完就访问不了了
[/Quote]
不能吧,难道string没有复制构造函数?
其实,第二个函数不成功的和这个说的没有关系。而是它的返回类型
const string & findmaxwrong( const vector<string> & arr)
是引用返回,也就是返回了局部变量的银行。
改成值返回也是OK的
const string findmaxwrong( const vector<string> & arr)
cloudjan 2011-04-26
  • 打赏
  • 举报
回复
你提的问题其实和for循环没有关系。因为两个变量的生命周期都是当前函数体

这其实是返回值的问题,函数的返回值是 const &string,在返回的时候不会进行值拷贝
在第一个函数中返回的是arr[ maxindex ],而arr不是局部变量,因此依然有效
而第二个函数返回的是maxvalue,在函数结束之后就进行了析构,因此返回之后就无效了
赵4老师 2011-04-26
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
就想叫yoko 2011-04-26
  • 打赏
  • 举报
回复
当然我指的的是maxindex和maxvalue两个变量[Quote=引用 4 楼 q191201771 的回复:]

出了for循环 2个都有用
出了函数 2个都没用
[/Quote]
就想叫yoko 2011-04-26
  • 打赏
  • 举报
回复
出了for循环 2个都有用
出了函数 2个都没用
蜥蜴枪王 2011-04-26
  • 打赏
  • 举报
回复
maxindex 和 maxvalue 都是局部变量都只在各自的函数体内有效。
但第一个函数返回的是一个外部的栈中的string,所以生命周期有效,
而第二个函数返回的是一个局部的string类型变量,在该函数返回以后,maxvalue所在内存的内容被清空,正如一楼所言,第二个函数返回的局部指针是访问不了的.
pengzhixi 2011-04-26
  • 打赏
  • 举报
回复
第2个是返回了局部变量的引用,这个是不允许的。第一个没什么,maxindex只是下标,返回的是的下标对应的元素
bdmh 2011-04-26
  • 打赏
  • 举报
回复
int型会执行复制,string类型是特殊类型,它其实访问的是指针,局部指针执行完就访问不了了

65,204

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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