| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2082 人关注过本帖
标题:[讨论]给出这个程序的运行结果
只看楼主 加入收藏
flylee
Rank: 5Rank: 5
等 级:职业侠客
帖 子:309
专家分:374
注 册:2004-8-10
收藏
 问题点数:0 回复次数:12 
[讨论]给出这个程序的运行结果

#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; }

给出程序的运行结果

搜索更多相关主题的帖子: myclass int 结果 cout 
2004-08-13 18:39
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 

我单步执行查看,没有道理呀!

display(a);以及析构函数竟然执行了两次.然后,由于已经delete 一次p,第二次析构函数又执行一次delete,导致内存异常!!

可能是编译器的错误!!

希望有高手给个解释!!


永不放弃!
2004-08-13 20:54
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 
补充,我用的是vc++ 6.0

永不放弃!
2004-08-13 20:55
flylee
Rank: 5Rank: 5
等 级:职业侠客
帖 子:309
专家分:374
注 册:2004-8-10
收藏
得分:0 
编译没有错误,是我的代码本身有错误
2004-08-14 00:29
flylee
Rank: 5Rank: 5
等 级:职业侠客
帖 子:309
专家分:374
注 册:2004-8-10
收藏
得分:0 
这个程序不讨论代码是否有错,只要求给出运行结果即可
2004-08-14 00:29
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

void display(myclass &ob)

你在ob前面漏了&,取地址,无问题的,自己再运行一下吧!

//#include <cstdlib.h> //using namespace std;

我的旧VC通不过这两行,能说一下那个头文件有什么用吗?

2004-08-14 01:11
flylee
Rank: 5Rank: 5
等 级:职业侠客
帖 子:309
专家分:374
注 册:2004-8-10
收藏
得分:0 

都说过了,代码里面的错误是故意弄上去的

2004-08-14 01:14
flylee
Rank: 5Rank: 5
等 级:职业侠客
帖 子:309
专家分:374
注 册:2004-8-10
收藏
得分:0 

"><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里面的解释

2004-08-14 01:17
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

#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(...) 函数,作为类的成员函数,写在类中,也可解决以上问题。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-08-14 03:15
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
以下是引用flylee在2004-08-14 00:29:55的发言: 这个程序不讨论代码是否有错,只要求给出运行结果即可

运行结果是找不到对象!可以说是运行不了。

2004-08-14 11:17
快速回复:[讨论]给出这个程序的运行结果
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015503 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved