| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 589 人关注过本帖
标题:类成员函数新建和返回
只看楼主 加入收藏
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
结帖率:96.25%
收藏
已结贴  问题点数:20 回复次数:6 
类成员函数新建和返回
如下,在newA里new出来的空间会不会在函数结束时被系统收回,这段空在主函数里还有没有效.
#include <iostream.h>
class A
{
public:
    A& newA();
    int a;
};

A& A::newA()
{
    A *p;
    p=new A;
    return *this;
}


void main()
{
    A bb;
    bb.newA();
}
搜索更多相关主题的帖子: 函数 成员 
2009-08-02 20:31
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:5 
你说呢?如果会收回那new运算符有什么用?直接定义变量不就行了
2009-08-02 22:42
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:5 
回复 楼主 mfkblue
当然是不会收回了,不过你写的那个newA有点奇怪哟。。

比如你有一个对象bb,构造bb显然由于你没提供构造函数,会用系统自己提供的。那么你现在就一个A对象了,之后你调用bb的成员函数newA。它申请了一个新的对象,并把那个对象的首地址给了p。不过这个p在退出函数之前会被删除,那么应该把它指向的首地址拷贝出来才行,但你没有,返回*this其实返回的是调用者bb的地址,是不是和你的原意不太一样呢?

这个可能是你this指针的相关语法没有弄的很清楚。
2009-08-03 13:05
CrystalFan
Rank: 8Rank: 8
来 自:江苏南京
等 级:蝙蝠侠
帖 子:187
专家分:802
注 册:2009-7-30
收藏
得分:10 
在函数newA()中new A申请的空间是有效的,但是你已经造成了内存泄露,因为退出newA()函数后指针p已经无效了,你永远不可能访问到p指向的空间(即 new A 申请的空间)了。
如果你将newA()函数最后一句改为
return *p;
那就是正确的,上述空间在main()函数中仍然有效,如可以写下面的句子:
程序代码:
void main()
{
    A bb;
    int c,d;
    c=(bb.newA()).a;
    d=((bb.newA()).newA()).a
} 

不过此时还是会内存泄露,因为你用new A申请的内存没有用delete释放。
应该改为:
程序代码:
#include <iostream.h>
class A
{
public:
    A& newA();
    int a;
};

A& A::newA()
{
    A *p; 
    p=new A;
    return *p;
}


void main()
{
    A bb;
    int i;
    A* q;
    q=&(bb.newA());
    i=q->a;
    /*可加入其他操作*/
    delete q;    
} 


[[it] 本帖最后由 CrystalFan 于 2009-8-3 15:47 编辑 [/it]]
2009-08-03 15:45
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
收藏
得分:0 
不好意思了~
是我没说清楚,也没也写清楚。
现在正在看链表,所以那个new出的我并不想它返回,我要在函数里把new出的空间首地址赋给对象bb的的私有数据,只是没写出来,代码已经完成了一部分,只是有时候搞不清楚这个空间释放和没释放,能用和不能用。
这次代码太长,一部分是例题,一部分是题目要求,我看的都觉得昏。就不贴出来。贴出来估计也没人看.绝对是我学C语言以来写最长的一次代码了,目前已经超500行。
2009-08-03 20:23
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 5楼 mfkblue
呵呵,500多行确实是挺多了~ 做大一点的项目如果最后有错误,调试可是很费劲的哟,要做好心理准备~~
2009-08-04 13:46
快速回复:类成员函数新建和返回
数据加载中...
 
   



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

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