返回的结果为什么不是1?

binbinxz 2011-07-17 03:33:45
#include "stdafx.h"
#include <iostream>
using namespace std;
class base
{
int *p,m;
public:
base(int a){p = &a;m = a;}
int Getx(){return *p;}
~base(){delete p;}

};
int _tmain(int argc, _TCHAR* argv[])
{
base a(1);
cout<<a.Getx();
return 0;
}
...全文
151 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
binbinxz 2011-07-18
  • 打赏
  • 举报
回复
明白了,谢谢各位。
  • 打赏
  • 举报
回复
a(1),注意临时对象
whhqzx 2011-07-17
  • 打赏
  • 举报
回复
delete和new是配对使用的,用new从堆中申请了一块内存空间后,当不需要在用时我们就需要用delete把它释放掉,不然将会有内存泄露。 楼上说: base a(1);属于传值函数,寻址方式为立即数寻址赋值。
而立即数寻址的特点是没有任何地址(寄存器或者主存), 其实那只是当你要传的值比较小的时候是这种情况,当你要传的值较大是就不是这种情况了。此时,编译器会把你要传的数据放在只读数据段。

-------------------------------------------------------------------------------------

更多技术文章敬请关注:武汉华嵌-嵌入式培训专家,国内领先的嵌入式服务机构

http://www.embedhq.org
tbwork 2011-07-17
  • 打赏
  • 举报
回复
函数传值分三种:传值,传名(&),传地址(*)。
base a(1);属于传值函数,寻址方式为立即数寻址赋值。
而立即数寻址的特点是没有任何地址(寄存器或者主存)
既然没有地址,那么*p就无效。p为随机值,*p也不会是1;
改成这样:

//---------------------------------------------------------------------------

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
#include <iostream>
using namespace std;
class base
{
int *p;
int m;
public:
base(){p=NULL;}
base(int&a){p = &a;m = a;}// 使用传名
int Getx(){return *p;}
~base(){
//p只是个指针,记住delete 和new 是成对出现的,没有出现new 就不要用delete
}

};

int main(int argc, char* argv[])
{
int b=1;
base a(b);
cout<<a.Getx();
return 0;
}
至善者善之敌 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lifesider 的回复:]
~base(){delete p;}

这个delete也会出错的
p指向了局部参数a的地址,这是一个堆栈地址,当构造函数退出时就无效了
[/Quote]

+++1,因为a算是个局部变量
所以结果不为1
另外
析构~base(){}
某某9 2011-07-17
  • 打赏
  • 举报
回复
delete只删除new对象。。

返回1
jernymy 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lifesider 的回复:]
~base(){delete p;}

这个delete也会出错的
p指向了局部参数a的地址,这是一个堆栈地址,当构造函数退出时就无效了
[/Quote]

可以用类的成员,而不要用局部参数
lifesider 2011-07-17
  • 打赏
  • 举报
回复
~base(){delete p;}

这个delete也会出错的
p指向了局部参数a的地址,这是一个堆栈地址,当构造函数退出时就无效了
lifesider 2011-07-17
  • 打赏
  • 举报
回复
base a(1)中,p指向了一个随机地址

64,646

社区成员

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

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