找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 465|回复: 9

[讨论]给出这个程序的运行结果

[复制链接]
发表于 2009-10-31 01:04:28 | 显示全部楼层 |阅读模式 IP:江苏扬州
#include <iostream> #include <cstdlib> using namespace std;
class myclass { int *p; public: myclass(int i); ~myclass(); int getval(){return *p;} };
myclass::myclass(int i) { cout<<"Allocating p\n"; p = new int; *p = i; }
myclass::~myclass() { cout<<"Freeing p\n"; delete p; }
void display(myclass ob) { cout<<ob.getval()<<'\n'; }
int main() { myclass a(10); display(a);
return 0; }
给出程序的运行结果
发表于 2009-10-31 01:04:29 | 显示全部楼层 IP:江苏扬州
我单步执行查看,没有道理呀!
display(a);以及析构函数竟然执行了两次.然后,由于已经delete 一次p,第二次析构函数又执行一次delete,导致内存异常!!
可能是编译器的错误!!
希望有高手给个解释!!
回复

使用道具 举报

发表于 2009-10-31 01:04:30 | 显示全部楼层 IP:江苏扬州
补充,我用的是vc++ 6.0
回复

使用道具 举报

发表于 2009-10-31 01:04:30 | 显示全部楼层 IP:江苏扬州
编译没有错误,是我的代码本身有错误
回复

使用道具 举报

发表于 2009-10-31 01:04:31 | 显示全部楼层 IP:江苏扬州
这个程序不讨论代码是否有错,只要求给出运行结果即可
回复

使用道具 举报

发表于 2009-10-31 01:04:33 | 显示全部楼层 IP:江苏扬州
void display(myclass &ob)
你在ob前面漏了&,取地址,无问题的,自己再运行一下吧!
//#include <cstdlib.h> //using namespace std;
我的旧VC通不过这两行,能说一下那个头文件有什么用吗?
回复

使用道具 举报

发表于 2009-10-31 01:04:34 | 显示全部楼层 IP:江苏扬州
都说过了,代码里面的错误是故意弄上去的
回复

使用道具 举报

发表于 2009-10-31 01:04:35 | 显示全部楼层 IP:江苏扬州
"><cstdlib>
namespace std {#include <stdlib.h> };Include the standard header <cstdlib> to effectively include the standard header <stdlib.h> within the std namespace.
——MSDN Library里面的解释
回复

使用道具 举报

发表于 2009-10-31 01:04:36 | 显示全部楼层 IP:江苏扬州
#include <iostream> using namespace std;
class myclass { int *p; public: myclass(int i); ~myclass(); int getval() { return *p; } };
myclass::myclass(int i) { cout<<"Allocating p\n"; p = new int; *p = i; }
myclass::~myclass() { cout<<"Freeing p\n"; delete p; }
void display(myclass & ob) //instead of using value, should use reference { //or write this function inside the class, so that it will be class member function cout<<ob.getval()<<'\n'; }
int main() { myclass a(10); display(a); return 0; }
在这段代码中不需要那个 #include <stdlib.h>
如果你要加一句 system("pause"); 以便程序运行时显示结果,则需要那个头文件。
楼主那个程序之所以出错,是因为在按值传递时,在内存中复制了一个 object a,在程序结束时,这个复制的临时的object a 也要被释放,这样在一个地址下两次释放内存,导致出错。而 如果用引用传值,则没有那个那个临时复制的对象,这样问题就解决了,还有一个办法是将 display(...) 函数,作为类的成员函数,写在类中,也可解决以上问题。
回复

使用道具 举报

发表于 2009-10-31 01:04:38 | 显示全部楼层 IP:江苏扬州
以下是引用flylee在2004-08-14 00:29:55的发言: 这个程序不讨论代码是否有错,只要求给出运行结果即可
运行结果是找不到对象!可以说是运行不了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 13:31 , Processed in 0.212137 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表