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

问一个内存泄露的问题--通常人们称之为匿名对象

VanHorn 发布于 2008-10-07 22:29, 2411 次点击
///例如我有一个类

////////////////////////////////
////类头文件/////
////////////////////////////
#include "iostream.h"

class A
{
public :
    A();
    A(A* p);
    A(int para1,int para2);
    ~A();
    void show();
private :
    int a;
    int b;
};
////////////////////////
////头文件完
/////////////////////////


/////////////////////
///实现部分
////////////////////////
A::A():a(0),b(0)
{
   
}

A::A(A *p)
{
    a=p->a;
    b=p->b;
}


A::A(int para1,int para2):a(para1),b(para2)
{
    
}

void A::show()
{
   cout<<a<<endl;
   cout<<b<<endl;
}
///////////////////////////
////实现部分完
////////////////////////////


//////////////////////////////
/////函数入口部分
//////////////////////////
A* TestFuncA(int a,int b)
{
    return new A(a,b);
    //问题就在这里,申明了匿名对象后,怎么释放匿名对象的内存  
    //例如主函数的调用方式。怎么释放现在分配的内存?
}

int TestFuncB(A *a)
{
    A* temp = a;
   
    if(temp!=NULL)
    {
        temp->show();
        return 1;
    }
    else
    {
        return -1;
    }
}

void main()
{

    TestFuncB(TestFuncA(10 , 20));
    
}
15 回复
#2
守鹤2008-10-07 22:34
delete
#3
VanHorn2008-10-07 22:40
怎么个delete法?
#4
sunkaidong2008-10-07 22:44
[bo][un]守鹤[/un] 在 2008-10-7 22:34 的发言:[/bo]

delete

 可以说仔细吗?已经没指针指向了。。。
#5
lscmxl2008-10-08 13:32
return new A(a,b); 非要这么写吗?
麻烦点就定义个全局变量指向它的首地址,析构时delete全局变量吧。
愚见。
#6
sunkaidong2008-10-08 15:12
问一个内存泄露的问题。我的理解是,在一个应用程序生命周期里面,由于new的对象没有赋值给指针,这样就没办法delete了。一旦这个过程持续,导致内存越用越少,程序越来越慢,java有垃圾回收机制,但是c++必须自己释放。。。c++primer里面有种p_str类,c++自身也有一种工厂化模式。。。都可以自己看看
#7
VanHorn2008-10-08 18:21
我的核心思想就是想问问怎么释放匿名对象的内存。
#8
yzy68065552008-10-08 21:53
没有见过啊?
如果没人回答,还得最笨的办法啦!再重新定义个内部指针了,
#9
忘记喧嚣2008-10-08 23:16
我决得 可以用一个 A对象来接收
A* TestFuncA(int a,int b)
{
    return new A(a,b);
    //问题就在这里,申明了匿名对象后,怎么释放匿名对象的内存  
    //例如主函数的调用方式。怎么释放现在分配的内存?
}
这个的返回值(不知道可以引用不)  然后释放这个 这个创建的对象
应该就可以释放了
#10
冰烨2008-10-09 08:48
A* TestFuncA(int a,int b)
{
    return new A(a,b);
    //问题就在这里,申明了匿名对象后,怎么释放匿名对象的内存  
    //例如主函数的调用方式。怎么释放现在分配的内存?
}
这个的返回值是申请空间的地址的话应该是可以被使用的
所以 当TestFuncB(TestFuncA(10 , 20));时候,这个地址便成了TestFuncB的实参了。。
那么
int TestFuncB(A *a)
{
    A* temp = a;
   
    if(temp!=NULL)
    {
        temp->show();
        delete a;//释放a指向的内存就OK了吧
        return 1;
    }
    else
    {
        return -1;
        delete a;//释放a指向的内存就OK了吧

    }
}
#11
VanHorn2008-10-09 09:06
[bo][un]冰烨[/un] 在 2008-10-9 08:48 的发言:[/bo]

A* TestFuncA(int a,int b)
{
    return new A(a,b);
    //问题就在这里,申明了匿名对象后,怎么释放匿名对象的内存  
    //例如主函数的调用方式。怎么释放现在分配的内存?
}
这个的返回值是申请空间的地 ...

这个想法不错,啥时候用完了啥时候释放。如果我 delete temp; 呢?可不可以啊?应该达到相似的效果吧?
#12
冰烨2008-10-09 09:27
嗯,是一样的
#13
StarWing832008-10-09 09:44
1 你可以返回auto_ptr<A>
2 事实上,作为源/汇程序的一个典型,是这样的:
auto_ptr<A> source() {return new A;}
void sink(auto_ptr<A>) {}
这个是优雅而又安全的写法,至于为什么可以这样,你可以自己想想看。注意sink函数的参数,不是引用类型哦~
#14
sunkaidong2008-10-09 16:14
惭愧啊。。翅膀我auto_ptr<A>都记错了。。。哎
#15
VanHorn2008-10-10 15:46
[bo][un]StarWing83[/un] 在 2008-10-9 09:44 的发言:[/bo]

1 你可以返回auto_ptr
2 事实上,作为源/汇程序的一个典型,是这样的:
auto_ptr source() {return new A;}
void sink(auto_ptr) {}
这个是优雅而又安全的写法,至于为什么可以这样,你可以自己想想看。注意sin ...

恩,用智能指针。的确是一个不错的思路。谢谢版主,以及楼上的各位热心人。
#16
中学者2008-10-10 22:36
回复 1# VanHorn 的帖子
什么方法暂且不说...StarWing也已经说了用智能指针,也就是RAII机制...但是你的这个函数本身就不是异常安全的~~   要找问题就先解决你的函数变得异常安全...
1