积极答复者
用VS2010编写C++程序,释放内存出错

问题
-
#include "stdafx.h"#include "string"#include "iostream"using namespace std;#define NUM 100class 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;}
答案
-
#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.- 已编辑 VisualElevenModerator 2011年4月10日 10:59 乱码问题
- 已标记为答案 VisualElevenModerator 2011年4月11日 7: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,现在看代码优化的地方比较多。
麻烦把正确答案设为解答。- 已标记为答案 VisualElevenModerator 2011年4月11日 7:58
全部回复
-
#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.- 已编辑 VisualElevenModerator 2011年4月10日 10:59 乱码问题
- 已标记为答案 VisualElevenModerator 2011年4月11日 7: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,现在看代码优化的地方比较多。
麻烦把正确答案设为解答。- 已标记为答案 VisualElevenModerator 2011年4月11日 7:58