注册 登录
编程论坛 C++教室

c++ prime plus 有一道例题不懂 菜鸟请教

gsl1510 发布于 2011-06-12 15:39, 618 次点击
#include <iostream>
#include <string>
using namespace std;
string version1(const string & s1,const string & s2);
const string & version2(string & s1,const string & s2);
const string & version3(string & s1,const string & s2);

int main()
{
    string input;
    string copy;
    string result;

    cout<<"Enter a string : ";
    getline(cin,input);
    copy=input;
    cout<<"Your string as entered: "<<input<<endl;
    result=version1(input,"***");
    cout<<"Your string enhanced: "<<result<<endl;
    cout<<"Your original string: "<<input<<endl;

    result=version2(input,"###");
    cout<<"Your string enhanced: "<<result<<endl;
    cout<<"Your original string: "<<input<<endl;
    cout<<"Resetting original string.\n";
    input =copy;
    result=version3(input,"@@@");
    cout<<"Your string enhanced: "<<result<<endl;
    cout<<"Your original string: "<<input<<endl;
    return 0;
}

string version1(const string & s1,const string & s2)
{
    string temp;
    temp=s2+s1+s2;
    return temp;
}

const string & version2(string & s1,const string & s2)
{
    s1=s2+s1+s2;
    return s1;
}

const string & version3(string & s1,const string &s2)
{
    string temp;
    temp=s2+s1+s2;
    return temp;
}
5 回复
#2
gsl15102011-06-12 15:39
书上说 第三个函数版本是致命缺陷,执行第三个函数时将崩溃。
问题是由下面的复制语句引发的:
result=version3(input,"@@@");
程序试图引用已经释放的内存。
#3
gsl15102011-06-12 15:40
但是我搞不清楚到底怎么错
请各位大侠帮忙指点一下我这个小菜鸟
#4
BlueGuy2011-06-12 16:11
以下是引用gsl1510在2011-6-12 15:40:10的发言:

但是我搞不清楚到底怎么错
请各位大侠帮忙指点一下我这个小菜鸟
你自己不是解释的很清楚了吗?
const string & version3(string & s1,const string &s2)
{
    string temp;
    temp=s2+s1+s2;
    return temp;
}
temp 是个局部变量, 函数调用结束会自动释放.

[ 本帖最后由 BlueGuy 于 2011-6-12 16:12 编辑 ]
#5
BlueGuy2011-06-12 16:20
本人c++ 菜鸟, 进来学习的
#6
gsl15102011-06-12 16:30
V3函数定义返还值 引用了temp
而temp只是一个临时变量
1