none
用VS2010编写C++程序,释放内存出错 RRS feed

  • 问题

  • #include "stdafx.h"
    #include "string"
    #include "iostream"
    using namespace std;
    #define NUM 100
    class MyString
    {
    private:
    string *m_data;
    public:
    MyString(){m_data=new string;}
    MyString(string a){m_data=new string(a);}
    ~MyString(){delete m_data;}                                    
     /* 如果不写delete则没有错误,写上则出现 “Unhandled exception at 0x53681f68(msvcp100d.dll), 0xC0000005:Access violation reading location 0xfeeefeee.*/
    MyString(MyString &s){m_data=new string(*s.m_data);}
    MyString operator + (MyString s);
    void show();
    };
    MyString MyString::operator+(MyString s)
    {
    string a,b,c;
    a=*m_data;
    b=*(s.m_data);
    c=a+b;
    return MyString(c);
    }
    void MyString::show()
    {
    cout<<*m_data<<endl;
    }
    int main()
    {
    string a,b;
    cout<<"请分别输入两个字符串:"<<endl;
    cin>>a>>b;
    MyString S1(a),S2(b),S3;
    S3=S1+S2;
    S3.show();
    int s;
    cin>>s;
    return 1;
    }
    2011年4月9日 14:02

答案

  • #include "stdafx.h"
    #include "string"
    #include "iostream"
    using namespace std;
    #define NUM 100
    class MyString
    {
    private:
     string *m_data;
    public:
     MyString(){m_data=new string;}
     MyString(string a){m_data=new string(a);}
     ~MyString(){delete m_data;}                                   
     /* 如果不写delete则没有错误,写上则出现Unhandled exception at 0x53681f68(msvcp100d.dll), 0xC0000005:Access violation reading location 0xfeeefeee.*/
     MyString(MyString &s){m_data=new string(*s.m_data);}
     MyString* operator + (MyString s);
     void show();
    };
    MyString* MyString::operator+(MyString s)
    {
     string a,b,c;
     a=*m_data;
     b=*(s.m_data);
     c=a+b;
     return new MyString(c);
    }
    void MyString::show()
    {
     cout<<*m_data<<endl;
    }
    int main()
    {
     string a,b;
     cout<<"请分别输入两个字符串:"<<endl;
     cin>>a>>b;
     MyString S1(a),S2(b),*S3;
     S3=S1+S2;
     S3->show();
     delete S3;
     S3 = NULL;
     int s;
     cin>>s;
     return 1;
    }
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年4月10日 10:58
    版主
  • 缺少等号运算法重载

    S3=S1+S2;

    这里会调用operator = 但是没有所以进行浅层拷贝。导致临时变量中早已把S3的m_data释放了。

    const MyString& opertaor=(const MyString& r)

    {

        if(this == &r)

    {

       return *this;

    }

    else

    {

    deletet m_data;

    m_data=new string(*r.m_data);

    }
    }

    你也可以尝试使用COW,现在看代码优化的地方比较多。

     


    麻烦把正确答案设为解答。
    2011年4月11日 5:36
    版主

全部回复

  • #include "stdafx.h"
    #include "string"
    #include "iostream"
    using namespace std;
    #define NUM 100
    class MyString
    {
    private:
     string *m_data;
    public:
     MyString(){m_data=new string;}
     MyString(string a){m_data=new string(a);}
     ~MyString(){delete m_data;}                                   
     /* 如果不写delete则没有错误,写上则出现Unhandled exception at 0x53681f68(msvcp100d.dll), 0xC0000005:Access violation reading location 0xfeeefeee.*/
     MyString(MyString &s){m_data=new string(*s.m_data);}
     MyString* operator + (MyString s);
     void show();
    };
    MyString* MyString::operator+(MyString s)
    {
     string a,b,c;
     a=*m_data;
     b=*(s.m_data);
     c=a+b;
     return new MyString(c);
    }
    void MyString::show()
    {
     cout<<*m_data<<endl;
    }
    int main()
    {
     string a,b;
     cout<<"请分别输入两个字符串:"<<endl;
     cin>>a>>b;
     MyString S1(a),S2(b),*S3;
     S3=S1+S2;
     S3->show();
     delete S3;
     S3 = NULL;
     int s;
     cin>>s;
     return 1;
    }
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年4月10日 10:58
    版主
  • 错误的原因是什么呢?不明白。
    2011年4月11日 3:48
  • 缺少等号运算法重载

    S3=S1+S2;

    这里会调用operator = 但是没有所以进行浅层拷贝。导致临时变量中早已把S3的m_data释放了。

    const MyString& opertaor=(const MyString& r)

    {

        if(this == &r)

    {

       return *this;

    }

    else

    {

    deletet m_data;

    m_data=new string(*r.m_data);

    }
    }

    你也可以尝试使用COW,现在看代码优化的地方比较多。

     


    麻烦把正确答案设为解答。
    2011年4月11日 5:36
    版主