C++函数中局部变量的清除是在return前还是后?

 我来答
匿名用户
2013-12-15
展开全部

用类中的析构函数测试一下就知道了!

#include <iostream>

#include <string>

using namespace std;

class Test

{

public:

int num;

string str;

public:

Test(int m_num, string m_str)

{

num = m_num;

str = m_str;

}

void show()

{

cout << "num = " << num << endl;

cout << "str = " << str << endl;

}

~Test()

{

cout << "这是析构函数,便于查看变量什么时候销毁!" << endl;

}

};

int call_test(Test m_obj);  //注意是传值(变量的一份拷贝)

int main()

{

Test obj(10, "hello world");

call_test(obj);   //在函数中查看变量(一份拷贝)的销毁

system("pause");

return 0;

}

然后单步跟踪程序,

int call_test(Test m_obj)

{

m_obj.show();

return 0;

}

下面的第一张图片是在函数中的情况,当程序运行到return 0的时候,并没有调用obj 的析构函数

继续单步,看第二张图片,出现了析构函数的调用,说明这个时候才销毁变量obj(这个对象本来就是一个变量),所以我说,变量是在return 0之后进行销毁的!

继续单步(查看main函数的对象变量是在上面时候销毁的):

看第三张图片,这个是在main函数的变量(就是obj这个对象),是在main函数中return 0之后进行调用析构函数的!

析构函数的作用就是销毁对象中的成员变量。我发现调用析构函数都是在return 0之后调用。

所以:变量是在return 0之后进行销毁的!(只是我的个人意见,有可能是错误的)

匿名用户
2013-12-15
展开全部
C++的代码被编译后,会变成一串的机器代码。其中的return语句会变成一组堆栈弹出以恢复堆栈原状,以及最终RET返回调用点的代码。这里的堆栈弹出就是清理函数局部变更的过程。

所以,准确地说,局部变量会在RET前被清理。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sorry1_11
2014-07-05 · TA获得超过1067个赞
知道答主
回答量:144
采纳率:50%
帮助的人:31.2万
展开全部
看源码的汇编,在RET前有退栈动作,这是汇编的基础,所有高级语言中不理解的问题在汇编中都会看的一清二楚
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-12-15
展开全部
应该是return前吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式