| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 631 人关注过本帖
标题:请教关于内存释放问题,如何处理重载>>是释放空间错误(代码如下)
只看楼主 加入收藏
zxh_85
Rank: 2
等 级:论坛游民
帖 子:8
专家分:11
注 册:2010-8-29
结帖率:0
收藏
已结贴  问题点数:0 回复次数:5 
请教关于内存释放问题,如何处理重载>>是释放空间错误(代码如下)
class Mystring
{
public:
    Mystring(const char *str=NULL);
    Mystring(const Mystring &);
    ~Mystring();
    Mystring operator=(const Mystring &);
    friend Mystring operator+(Mystring &,Mystring &);
    friend ostream &operator<<(ostream&, Mystring &);
    friend istream &operator>>(istream&, Mystring &);
private:
    char *m_data;
};

Mystring::Mystring(const char *str)
{
    if(str==NULL)
    {
        delete m_data;
        m_data=new char[1];
        m_data='\0';
    }
    else
    {
        int len=0;
        while(str[len]!='\0')
        {
            len++;
        }
        m_data=new char[len+1];
        ::memset(m_data,0,len+1);
        for(int i=0; i<len;i++)
        {

            m_data[i]=str[i];
        }
    }
}
Mystring::Mystring(const Mystring &mystr)
{
    int len=0;
    while(mystr.m_data[len]!='\0')
    {
        len++;
    }
    m_data=new char[len+1];
    ::memset(m_data,0,len+1);
    for(int i=0; i<len;i++)
    {
        
        m_data[i]=mystr.m_data[i];
    }
}

Mystring::~Mystring
{
    delete []m_data;
    m_data=NULL;
}


Mystring Mystring::operator=(const Mystring &mystr)
{
    int len=0;
    while(mystr.m_data[len]!='\0')
    {
        len++;
    }
    m_data=new char[len+1];
    ::memset(m_data,0,len+1);
    for(int i=0; i<len;i++)
    {
        
        m_data[i]=mystr.m_data[i];
    }
    return *this;
}
Mystring operator+(Mystring &mystr1,Mystring &mystr2)
{
    int len1=0;
    int len2=0;
    while(mystr1.m_data[len1]!='\0')
    {
        len1++;
    }
    while(mystr2.m_data[len2]!='\0')
    {
        len2++;
    }
    char *str=new char[len1+len2+1];
    ::memset(str,0,len1+len2+1);
    for(int i=0; i<len1+len2;i++)
    {
        if(i<len1)
        {
            str[i]=mystr1.m_data[i];
        }
        else
        {
            str[i]=mystr2.m_data[i-len1];
        }
    }
    return Mystring(str);
}
ostream &operator<<(ostream &out, Mystring &mystr)
{
    out<<mystr.m_data;
    return out;
}
istream &operator>>(istream &in, Mystring &mystr)
{
    in>>mystr.m_data;
    return in;
}

重载>>后,调用析构函数时时会报错的,因为没有相应的堆区释放,请问各位大虾,如何避免这样的问题出现,析构函数自己写

ps:是Mystring创建对象mystring,cin>>mystring后,析构时报错

[ 本帖最后由 zxh_85 于 2010-8-29 12:22 编辑 ]
搜索更多相关主题的帖子: 内存 空间 代码 重载 释放 
2010-08-29 10:50
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:20 
把完整的代码贴出来看下,你重载的+和=都发生了内存泄露。

迭代的是人,递归的是神。
2010-08-29 12:27
zxh_85
Rank: 2
等 级:论坛游民
帖 子:8
专家分:11
注 册:2010-8-29
收藏
得分:0 
#include <iostream.h>  
#include <windows.h>

class Mystring
{
public:
    Mystring(const char *str=NULL);
    Mystring(const Mystring &);
    ~Mystring();
    Mystring operator=(const Mystring &);
    friend Mystring operator+(Mystring &,Mystring &);
    friend ostream &operator<<(ostream&, Mystring &);
    friend istream &operator>>(istream&, Mystring &);
private:
    char *m_data;
};

Mystring::Mystring(const char *str)
{
    if(str==NULL)
    {
        delete m_data;
        m_data=new char[1];
        m_data='\0';
    }
    else
    {
        int len=0;
        while(str[len]!='\0')
        {
            len++;
        }
        m_data=new char[len+1];
        ::memset(m_data,0,len+1);
        for(int i=0; i<len;i++)
        {

            m_data[i]=str[i];
        }
    }
}
Mystring::Mystring(const Mystring &mystr)
{
    int len=0;
    while(mystr.m_data[len]!='\0')
    {
        len++;
    }
    m_data=new char[len+1];
    ::memset(m_data,0,len+1);
    for(int i=0; i<len;i++)
    {
        
        m_data[i]=mystr.m_data[i];
    }
}

Mystring::~Mystring
{
    delete m_data;
    m_data=NULL;
}


Mystring Mystring::operator=(const Mystring &mystr)
{
    int len=0;
    while(mystr.m_data[len]!='\0')
    {
        len++;
    }
    m_data=new char[len+1];
    ::memset(m_data,0,len+1);
    for(int i=0; i<len;i++)
    {
        
        m_data[i]=mystr.m_data[i];
    }
    return *this;
}
Mystring operator+(Mystring &mystr1,Mystring &mystr2)
{
    int len1=0;
    int len2=0;
    while(mystr1.m_data[len1]!='\0')
    {
        len1++;
    }
    while(mystr2.m_data[len2]!='\0')
    {
        len2++;
    }
    char *str=new char[len1+len2+1];
    ::memset(str,0,len1+len2+1);
    for(int i=0; i<len1+len2;i++)
    {
        if(i<len1)
        {
            str[i]=mystr1.m_data[i];
        }
        else
        {
            str[i]=mystr2.m_data[i-len1];
        }
    }
    return Mystring(str);
}
ostream &operator<<(ostream &out, Mystring &mystr)
{
    out<<mystr.m_data;
    return out;
}
istream &operator>>(istream &in, Mystring &mystr)
{
    in>>mystr.m_data;
    return in;
}
int main()
{
    Mystring str1="asd";
    cout<<str1<<endl;
    Mystring str2="qwe";
    Mystring str3=str1+str2;
    cout<<str2<<endl;
    cout<<str3<<endl;
    Mystring str4;
    cin>>str4;
    cout<<str4<<endl;

    return 0;
}
2010-08-29 12:55
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
int main()
{
    Mystring str1="asd";
    cout<<str1<<endl;
    Mystring str2="qwe";
    Mystring str3=str1+str2;
    cout<<str2<<endl;
    cout<<str3<<endl;
    Mystring str4;//看看你的构造函数,指向空
    cin>>str4;//你往什么地方空的地方写入,出错
    cout<<str4<<endl;

    return 0;
}
你修改下构造函数
还有你在+和=的重载函数里使用了new还没有用delete来释放。

迭代的是人,递归的是神。
2010-08-29 13:51
zxh_85
Rank: 2
等 级:论坛游民
帖 子:8
专家分:11
注 册:2010-8-29
收藏
得分:0 
+和=开辟的是对象里面的私有成员的空间,对象调用完成后在主函数结束时就可以delete
2010-08-29 13:59
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
new申请的对象只能由我们自己去回收回来,主函数结束时不会帮你delete的,操作系统有可能会在你的程序结束后回收。new完以后再去delete是个好习惯,当然了你自己拿主意。

迭代的是人,递归的是神。
2010-08-29 14:02
快速回复:请教关于内存释放问题,如何处理重载>>是释放空间错误(代码如下) ...
数据加载中...
 
   



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

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