注册 登录
编程论坛 C++教室

类成员函数新建和返回

mfkblue 发布于 2009-08-02 20:31, 589 次点击
如下,在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();
}
6 回复
#2
leeco2009-08-02 22:42
你说呢?如果会收回那new运算符有什么用?直接定义变量不就行了
#3
pangding2009-08-03 13:05
回复 楼主 mfkblue
当然是不会收回了,不过你写的那个newA有点奇怪哟。。

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

这个可能是你this指针的相关语法没有弄的很清楚。
#4
CrystalFan2009-08-03 15:45
在函数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]]
#5
mfkblue2009-08-03 20:23
不好意思了~
是我没说清楚,也没也写清楚。
现在正在看链表,所以那个new出的我并不想它返回,我要在函数里把new出的空间首地址赋给对象bb的的私有数据,只是没写出来,代码已经完成了一部分,只是有时候搞不清楚这个空间释放和没释放,能用和不能用。
这次代码太长,一部分是例题,一部分是题目要求,我看的都觉得昏。就不贴出来。贴出来估计也没人看.绝对是我学C语言以来写最长的一次代码了,目前已经超500行。
#6
pangding2009-08-04 13:46
回复 5楼 mfkblue
呵呵,500多行确实是挺多了~ 做大一点的项目如果最后有错误,调试可是很费劲的哟,要做好心理准备~~
1