首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个stl内存释放有关问题,初学找不到原因,请大家给分析看看

2012-02-24 
一个stl内存释放问题,初学找不到原因,请大家给分析看看我开始学stl,但是确碰到了一个问题,就是我自己定义

一个stl内存释放问题,初学找不到原因,请大家给分析看看
我开始学stl,但是确碰到了一个问题,就是我自己定义了一个类,这个类中有指针,这个类的构造函数为指针分配了内存,但是再关闭这个程序时,却出现了异常,请强人给看看:(我个人感觉时在析构时产生了问题,但是问题在哪里?)

class   CXX
{
public:
        float*   pFloat;
        int   *pInt;
        explicit   CXX()
        {
                pFloat   =   new   float;
                pInt   =   new   int;
        }
        CXX(float   tmp,int   tmp1)
        {
                pFloat   =   new   float;
                *pFloat   =   tmp;
                pInt   =   new   int;
                *pInt   =   tmp1;
        }
        ~CXX()
        {
                if   (pFloat!=NULL)
                {
                        delete   []   pFloat;
                        pFloat   =   NULL;
                        delete   []   pInt;
                        pInt   =   NULL;
                }
        }
};
void   CtestSTLView::OnTestStl()
{
        std::list <CXX>   aaa;
        aaa.push_back(CXX(1,1));
        aaa.push_back(CXX(2,1));
        aaa.push_back(CXX(3,1));
        int   xxx   =   aaa.size();
        CString   str;
        str.Format( "%d ",xxx);
        AfxMessageBox(str);
        aaa.clear();
}


[解决办法]
class CXX
{
public:
float* pFloat;
int *pInt;
explicit CXX()
{
pFloat = new float;
pInt = new int;
}
CXX(float tmp,int tmp1)
{
pFloat = new float;
*pFloat = tmp;
pInt = new int;
*pInt = tmp1;
}

//加上这个就可以了。
CXX(const CXX& c) {
pFloat = new float(*c.pFloat);
pInt = new int(*c.pInt);
}
//这个最好也加上。
CXX& operator=(const CXX& c) {
if(&c != this) {
delete pFloat;
delete pInt;
pFloat = new float(*c.pFloat);
pInt = new int(*c.pInt);
}
return *this;
}

~CXX()
{
if (pFloat!=NULL)
{
delete [] pFloat;
pFloat = NULL;
delete [] pInt;
pInt = NULL;
}
}
};
[解决办法]
含有指针数据成员的类一般都要自定义拷贝构造函数,构造函数,和析购函数
你这里没有拷贝构造函数class CXX
{
public:
float* pFloat;
int *pInt;


explicit CXX()
{
pFloat = new float;
pInt = new int;
}
CXX(float tmp,int tmp1)
{
pFloat = new float;
*pFloat = tmp;
pInt = new int;
*pInt = tmp1;
}
//加入拷贝构造函数
CXX(CXX &t)
{pFloat=new (t.pFloat);
pInt=new (t.pInt);
}
~CXX()
{
if (pFloat!=NULL)
{
delete [] pFloat;
pFloat = NULL;
delete [] pInt;
pInt = NULL;
}
}
};
void CtestSTLView::OnTestStl()
{
std::list <CXX> aaa;
aaa.push_back(CXX(1,1));
aaa.push_back(CXX(2,1));
aaa.push_back(CXX(3,1));
int xxx = aaa.size();
CString str;
str.Format( "%d ",xxx);
AfxMessageBox(str);
aaa.clear();
}

热点排行