![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
C++在delete时出错了,不知道是什么原因
#include<iostream>#include<string>usingnamespacestd;classString{char*data;public:Stri...
#include<iostream>
#include<string>
using namespace std;
class String
{
char * data;
public:
String();
String(const char * pStr);
~String()
{delete [] data;}
void Input();
void Output1(int);
void Output2(int);
String(const String & str);
int GetLength() const;
int Find(char , int ) const;
void SubStr(int ,int);//返回从begin位置起,长度为size的子字符串(size缺省为剩余所有长度,begin缺省为字符串开头)
};
String::String(const char *pStr)
{
if (pStr)
{
data = new char[strlen(pStr) + 1];
strcpy(data, pStr);
}
else
{
data = new char[1];
*data = '\0';
}
}
void String::Input()
{
int m;
char c1[1024];
cout<<"请输入Email地址:";
cin>>c1;
m = strlen(c1);
delete [] data;
data = new char[m + 1];
strcpy(data,c1);
}
void String::Output1(int begin)
{
for(int i=0;i<begin;i++)
{
cout<<*data;
data++;
}
cout<<endl;
data=data-begin;
}
void String::Output2(int begin)
{
cout<<data<<endl;
}
String::String(const String & str1)
{
data = str1.data;
}
int String::GetLength() const
{
return (strlen(data));
}
int String::Find(char ch, int begin = 0) const
{
const char *p = data;
while(*p != ch && *p != '\0')
{
begin ++;
p ++;
}
if(*p == '\0')
{
return -1;
}
else
return (begin);
}
void String::SubStr(int begin = 0,int size = -1)
{
data = data + begin + 1;
}
int main()
{
char c[]="str";
int n, begin, size;
String str1(c);
str1.Input();
String str2(str1);
String str3(str1);
n = str1.GetLength();
begin = str1.Find('@');
while(begin == -1)
{
cout<<"输入错误!"<<endl;
str1.Input();
str2=str1;
n = str1.GetLength();
begin = str1.Find('@');
}
cout<<"该字符串长度为:"<<n<<endl;
cout<<"该地址的用户名:";
str1.Output1(begin);
size = n - begin - 1;
str3.SubStr(begin,size);
cout<<"该地址的服务器名:";
str3.Output2(begin);
}
系统出示的错误原因
for information on how your program can cause an assertion failure ,see the C++ documentation on asserts 展开
#include<string>
using namespace std;
class String
{
char * data;
public:
String();
String(const char * pStr);
~String()
{delete [] data;}
void Input();
void Output1(int);
void Output2(int);
String(const String & str);
int GetLength() const;
int Find(char , int ) const;
void SubStr(int ,int);//返回从begin位置起,长度为size的子字符串(size缺省为剩余所有长度,begin缺省为字符串开头)
};
String::String(const char *pStr)
{
if (pStr)
{
data = new char[strlen(pStr) + 1];
strcpy(data, pStr);
}
else
{
data = new char[1];
*data = '\0';
}
}
void String::Input()
{
int m;
char c1[1024];
cout<<"请输入Email地址:";
cin>>c1;
m = strlen(c1);
delete [] data;
data = new char[m + 1];
strcpy(data,c1);
}
void String::Output1(int begin)
{
for(int i=0;i<begin;i++)
{
cout<<*data;
data++;
}
cout<<endl;
data=data-begin;
}
void String::Output2(int begin)
{
cout<<data<<endl;
}
String::String(const String & str1)
{
data = str1.data;
}
int String::GetLength() const
{
return (strlen(data));
}
int String::Find(char ch, int begin = 0) const
{
const char *p = data;
while(*p != ch && *p != '\0')
{
begin ++;
p ++;
}
if(*p == '\0')
{
return -1;
}
else
return (begin);
}
void String::SubStr(int begin = 0,int size = -1)
{
data = data + begin + 1;
}
int main()
{
char c[]="str";
int n, begin, size;
String str1(c);
str1.Input();
String str2(str1);
String str3(str1);
n = str1.GetLength();
begin = str1.Find('@');
while(begin == -1)
{
cout<<"输入错误!"<<endl;
str1.Input();
str2=str1;
n = str1.GetLength();
begin = str1.Find('@');
}
cout<<"该字符串长度为:"<<n<<endl;
cout<<"该地址的用户名:";
str1.Output1(begin);
size = n - begin - 1;
str3.SubStr(begin,size);
cout<<"该地址的服务器名:";
str3.Output2(begin);
}
系统出示的错误原因
for information on how your program can cause an assertion failure ,see the C++ documentation on asserts 展开
4个回答
展开全部
好像有两处错误,一处是构造函数进行的是浅拷贝,你初始化了3个三string类型的实列,析构的时候对同一指针,释放了3次内存。 还有就是str3.SubStr这个函数串改了,data指针指向的地址,意思是你释放的内存 从data + beging +1开始释放 你申请的那么多字节的数据,但实际你申请的内存是从data 开始。所以越界了,有好几处越界不安全的。
#include<iostream>
#include<string>
using namespace std;
class String
{
char * data;
public:
String();
String(const char * pStr);
~String()
{delete [] data;}
void Input();
void Output1(int);
void Output2(int);
String(const String & str);
int GetLength() const;
int Find(char , int ) const;
char * SubStr(int ,int);//返回从begin位置起,长度为size的子字符串(size缺省为剩余所有长度,begin缺省为字符串开头)
};
String::String(const char *pStr)
{
if (pStr)
{
data = new char[strlen(pStr) + 1];
strcpy(data, pStr);
}
else
{
data = new char[1];
*data = '\0';
}
}
void String::Input()
{
int m;
char c1[1024];
cout<<"请输入Email地址:";
cin>>c1;
m = strlen(c1);
delete [] data;
data = new char[m + 1];
memset(data,0,m+1);
strncpy(data,c1,m );
}
void String::Output1(int begin)
{
for(int i=0;i<begin;i++)
{
cout<<*(data + i);
//data++;
}
cout<<endl;
//data=data-begin;
}
void String::Output2(int begin)
{
cout<<data<<endl;
}
String::String(const String & str1)
{
data = new char[strlen(str1.data) + 1];
strcpy(data, str1.data);
}
int String::GetLength() const
{
return (strlen(data));
}
int String::Find(char ch, int begin = 0) const
{
const char *p = data;
while(*p != ch && *p != '\0')
{
begin ++;
p ++;
}
if(*p == '\0')
{
return -1;
}
else
return (begin);
}
char * String::SubStr(int begin = 0,int size = -1)
{
return (char * )(data + begin + 1);
}
int main()
{
char c[]="str";
int n, begin, size;
String str1(c);
str1.Input();
#if 1
String str3(str1);
n = str1.GetLength();
begin = str1.Find('@');
while(begin == -1)
{
cout<<"输入错误!"<<endl;
str1.Input();
String str2(str1);
n = str1.GetLength();
begin = str1.Find('@');
}
cout<<"该字符串长度为:"<<n<<endl;
cout<<"该地址的用户名:";
str1.Output1(begin);
size = n - begin - 1;
#endif
str3.SubStr(begin,size);
cout<<"该地址的服务器名:";
str3.Output2(begin);
}
#include<iostream>
#include<string>
using namespace std;
class String
{
char * data;
public:
String();
String(const char * pStr);
~String()
{delete [] data;}
void Input();
void Output1(int);
void Output2(int);
String(const String & str);
int GetLength() const;
int Find(char , int ) const;
char * SubStr(int ,int);//返回从begin位置起,长度为size的子字符串(size缺省为剩余所有长度,begin缺省为字符串开头)
};
String::String(const char *pStr)
{
if (pStr)
{
data = new char[strlen(pStr) + 1];
strcpy(data, pStr);
}
else
{
data = new char[1];
*data = '\0';
}
}
void String::Input()
{
int m;
char c1[1024];
cout<<"请输入Email地址:";
cin>>c1;
m = strlen(c1);
delete [] data;
data = new char[m + 1];
memset(data,0,m+1);
strncpy(data,c1,m );
}
void String::Output1(int begin)
{
for(int i=0;i<begin;i++)
{
cout<<*(data + i);
//data++;
}
cout<<endl;
//data=data-begin;
}
void String::Output2(int begin)
{
cout<<data<<endl;
}
String::String(const String & str1)
{
data = new char[strlen(str1.data) + 1];
strcpy(data, str1.data);
}
int String::GetLength() const
{
return (strlen(data));
}
int String::Find(char ch, int begin = 0) const
{
const char *p = data;
while(*p != ch && *p != '\0')
{
begin ++;
p ++;
}
if(*p == '\0')
{
return -1;
}
else
return (begin);
}
char * String::SubStr(int begin = 0,int size = -1)
{
return (char * )(data + begin + 1);
}
int main()
{
char c[]="str";
int n, begin, size;
String str1(c);
str1.Input();
#if 1
String str3(str1);
n = str1.GetLength();
begin = str1.Find('@');
while(begin == -1)
{
cout<<"输入错误!"<<endl;
str1.Input();
String str2(str1);
n = str1.GetLength();
begin = str1.Find('@');
}
cout<<"该字符串长度为:"<<n<<endl;
cout<<"该地址的用户名:";
str1.Output1(begin);
size = n - begin - 1;
#endif
str3.SubStr(begin,size);
cout<<"该地址的服务器名:";
str3.Output2(begin);
}
展开全部
#include<iostream>
#include<string>
using namespace std;
class String
{
char * data;
public:
String();
String(const char * pStr);
~String()
{delete []data;}
void Input();
void Output1(int);
void Output2(int);
String(const String & str);
int GetLength() const;
int Find(char , int ) const;
void SubStr(int ,int);//返回从begin位置起,长度为size的子字符串(size缺省为剩余所有长度,begin缺省为字符串开头)
};
String::String(const char *pStr)
{
if (pStr)
{
data = new char[strlen(pStr) + 1];
strcpy(data, pStr);
}
else
{
data = new char[1];
*data = '\0';
}
}
void String::Input()
{
int m;
char c1[1024];
cout<<"请输入Email地址:";
cin>>c1;
m = strlen(c1);
delete [] data;
data = new char[m + 1];
strcpy(data,c1);
}
void String::Output1(int begin)
{
for(int i=0;i<begin;i++)
{
cout<<*data;
data++;
}
cout<<endl;
data=data-begin;
}
void String::Output2(int begin)
{
cout<<data+begin+1<<endl; //这样就不用修改data指向啦!
}
String::String(const String & str1)
{
data = new char[str1.GetLength()+1]; //因为是字符串,所以拷贝构造函数也应该给申请空间
strcpy(data,str1.data);
}
int String::GetLength() const
{
return (strlen(data));
}
int String::Find(char ch, int begin = 0) const
{
const char *p = data;
while(*p != ch && *p != '\0')
{
begin ++;
p ++;
}
if(*p == '\0')
{
return -1;
}
else
return (begin);
}
void String::SubStr(int begin = 0,int size = -1)
{
data = data + begin + 1;
}
int main()
{
char c[]="str";
int n, begin, size;
String str1(c);
str1.Input();
String str2(str1);
String str3(str1);
n = str1.GetLength();
begin = str1.Find('@');
while(begin == -1)
{
cout<<"输入错误!"<<endl;
str1.Input();
str2=str1;
n = str1.GetLength();
begin = str1.Find('@');
}
cout<<"该字符串长度为:"<<n<<endl;
cout<<"该地址的用户名:";
str1.Output1(begin);
size = n - begin - 1;
// str3.SubStr(begin,size); //这个函数有问题,你修改了data的指向,
//delete会删除由data指向开始计算的 str1.length * 1 的空间,这样会删除非你申请的空间,可能被其他程序使用,会报错
cout<<"该地址的服务器名:";
str3.Output2(begin);
return 0;
}
#include<string>
using namespace std;
class String
{
char * data;
public:
String();
String(const char * pStr);
~String()
{delete []data;}
void Input();
void Output1(int);
void Output2(int);
String(const String & str);
int GetLength() const;
int Find(char , int ) const;
void SubStr(int ,int);//返回从begin位置起,长度为size的子字符串(size缺省为剩余所有长度,begin缺省为字符串开头)
};
String::String(const char *pStr)
{
if (pStr)
{
data = new char[strlen(pStr) + 1];
strcpy(data, pStr);
}
else
{
data = new char[1];
*data = '\0';
}
}
void String::Input()
{
int m;
char c1[1024];
cout<<"请输入Email地址:";
cin>>c1;
m = strlen(c1);
delete [] data;
data = new char[m + 1];
strcpy(data,c1);
}
void String::Output1(int begin)
{
for(int i=0;i<begin;i++)
{
cout<<*data;
data++;
}
cout<<endl;
data=data-begin;
}
void String::Output2(int begin)
{
cout<<data+begin+1<<endl; //这样就不用修改data指向啦!
}
String::String(const String & str1)
{
data = new char[str1.GetLength()+1]; //因为是字符串,所以拷贝构造函数也应该给申请空间
strcpy(data,str1.data);
}
int String::GetLength() const
{
return (strlen(data));
}
int String::Find(char ch, int begin = 0) const
{
const char *p = data;
while(*p != ch && *p != '\0')
{
begin ++;
p ++;
}
if(*p == '\0')
{
return -1;
}
else
return (begin);
}
void String::SubStr(int begin = 0,int size = -1)
{
data = data + begin + 1;
}
int main()
{
char c[]="str";
int n, begin, size;
String str1(c);
str1.Input();
String str2(str1);
String str3(str1);
n = str1.GetLength();
begin = str1.Find('@');
while(begin == -1)
{
cout<<"输入错误!"<<endl;
str1.Input();
str2=str1;
n = str1.GetLength();
begin = str1.Find('@');
}
cout<<"该字符串长度为:"<<n<<endl;
cout<<"该地址的用户名:";
str1.Output1(begin);
size = n - begin - 1;
// str3.SubStr(begin,size); //这个函数有问题,你修改了data的指向,
//delete会删除由data指向开始计算的 str1.length * 1 的空间,这样会删除非你申请的空间,可能被其他程序使用,会报错
cout<<"该地址的服务器名:";
str3.Output2(begin);
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在VC6.0上编译只有main函数没有return这个错误,你在最后加一个return 0就ok了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序可读性很差,看得头晕。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询