读书人

自己写的一个简单String类动态创建数

发布时间: 2012-04-22 18:34:46 作者: rapoo

自己写的一个简单String类,动态创建数组后,析构函数出错~求救。。。。
#include"stdafx.h"
#include<iostream>
using namespace std;

class MyString{
public:
MyString(){str=0;} //无参数构造函数
MyString(const MyString &c); //复制构造函数
int GetLength(){return str_len;}; //返回字符串长度
char* ToString(){return str;}; //返回字符数组
MyString &operator = (char *p);//strcpy
int operator ==(MyString &s);//strcmp
MyString &operator + (MyString &s);//strcat
~MyString(); //析构函数
private:
char *str;
int array_len; //字符数组长
int str_len; //字符串实际长度
};

MyString::MyString(const MyString &c) //深复制构造函数
{
array_len=c.array_len;
str_len=c.str_len;
str=new char[array_len];
int i;
for(i=0;i<array_len;i++)
str[i]=c.str[i];
}
MyString &MyString::operator =(char *p)
{
str_len=strlen(p);
array_len=str_len+1;
str=new char[array_len];
for(int i=0;i<=str_len;i++)
str[i]=p[i];
return *this;
}
int MyString::operator==(MyString &s)
{
unsigned int i;
for(i=0;i<str_len;i++)
{
if(str[i]!=s.str[i])
break;
}
if(str[i]!=s.str[i])
return false;
else
return true;
}
MyString &MyString::operator +(MyString &s)
{
char *_str=new char[array_len]; //动态创建一个数组用来临时存放当前的字符串
strcpy(_str,str);
if(str)
delete[] str;
str=new char[array_len+s.str_len];
strcpy(str,_str);
if(_str)
delete[] _str;
strcat(str,s.str);
str_len=strlen(str);
array_len=str_len+1;
return *this;
}
MyString::~MyString()
{
if(str)
delete[] str;
}

int main()
{
MyString str1,str2,str3;
str1="abcdefg";
str2="123456";
if(str1==str2)
cout<<"字符串相等!"<<endl;
else
cout<<"字符串不相等!"<<endl;
str3=str1+str2;
cout<<str3.ToString()<<endl;
return 0;
}


老师让我们自己写个简单的String类,上面是我写的源代码,Release模式下运行没问题,Debug模式下运行出错,调试发现最后一次调用析构函数卡死的,求高银解救。。。。。

[解决办法]
因为str3和str1指向的是同一块内存。析构str3释放了内存,析构str1时就异常了。
你重载的+,逻辑上有些问题,不应该修改左值(str1),并且建议赋值函数再重载一个MyString的。

至于release没有异常,是因为编译器帮你容忍了。实际上程序是重复释放内存。


读书人网 >C++

热点推荐