复制构造函数上的程序崩溃
Program crash on copy constructor
我正在测试以下代码:
#include<bits/stdc++.h>
using namespace std;
class Stringtype{
char* str;
int length;
public:
Stringtype(){
str='[=10=]';
length=0;
}
Stringtype(const Stringtype& s){
cout<<"Constructor"<<endl;
strcpy(this->str, s.str);
this->length = s.length;
}
Stringtype(char* text){
strcpy(this->str, text);
this->length = strlen(str);
}
friend ostream& operator<<(ostream& stream, Stringtype s){
stream<<"Value :"<<endl;
for(int i=0;i<s.length;i++){
cout<<(s.str)[i];
}
cout<<endl;
stream<<"Length :"<<endl;
stream<<s.length<<endl;
return stream;
}
friend istream& operator>>(istream& stream, Stringtype& s){
cout<<"Enter the string"<<endl<<endl;
s.str = new char[30];
cin>>s.str;
s.length = strlen(s.str);
return stream;
}
};
int main(){
Stringtype s1, s2;
cin>>s1>>s2;
cout<<s1<<s2;
cout<<(s1>s2)<<endl;
cout<<(s1<s2)<<endl;
cout<<(s1==s2)<<endl;
cout<<(s1+s2)<<endl;
return 0;
}
此代码产生以下输出(正确输入后):
构造函数
然后崩溃。
我似乎不明白为什么...
非常感谢任何帮助。谢谢。
您实际上从未为字符串的内部内存表示保留内存。你需要在某处new
。否则你将写入你不拥有的内存,这正是这里发生的事情,就在你观察到的输出之后的下一行。
对了:这里不能抄袭,你的签名
friend ostream& operator<<(ostream& stream, Stringtype s){
应阅读:
friend ostream& operator<<(ostream& stream, const Stringtype& s){
虽然您在内存处理方面存在错误,但这并没有改变这一事实。
请更改以下内容
朋友 ostream& operator<<(ostream& stream, Stringtype s)
到
朋友 ostream& operator<<(ostream& stream, Stringtype& s)
取字符串s的引用
尝试初始化 str="",而不是 str='\0';
我正在测试以下代码:
#include<bits/stdc++.h>
using namespace std;
class Stringtype{
char* str;
int length;
public:
Stringtype(){
str='[=10=]';
length=0;
}
Stringtype(const Stringtype& s){
cout<<"Constructor"<<endl;
strcpy(this->str, s.str);
this->length = s.length;
}
Stringtype(char* text){
strcpy(this->str, text);
this->length = strlen(str);
}
friend ostream& operator<<(ostream& stream, Stringtype s){
stream<<"Value :"<<endl;
for(int i=0;i<s.length;i++){
cout<<(s.str)[i];
}
cout<<endl;
stream<<"Length :"<<endl;
stream<<s.length<<endl;
return stream;
}
friend istream& operator>>(istream& stream, Stringtype& s){
cout<<"Enter the string"<<endl<<endl;
s.str = new char[30];
cin>>s.str;
s.length = strlen(s.str);
return stream;
}
};
int main(){
Stringtype s1, s2;
cin>>s1>>s2;
cout<<s1<<s2;
cout<<(s1>s2)<<endl;
cout<<(s1<s2)<<endl;
cout<<(s1==s2)<<endl;
cout<<(s1+s2)<<endl;
return 0;
}
此代码产生以下输出(正确输入后):
构造函数
然后崩溃。
我似乎不明白为什么...
非常感谢任何帮助。谢谢。
您实际上从未为字符串的内部内存表示保留内存。你需要在某处new
。否则你将写入你不拥有的内存,这正是这里发生的事情,就在你观察到的输出之后的下一行。
对了:这里不能抄袭,你的签名
friend ostream& operator<<(ostream& stream, Stringtype s){
应阅读:
friend ostream& operator<<(ostream& stream, const Stringtype& s){
虽然您在内存处理方面存在错误,但这并没有改变这一事实。
请更改以下内容 朋友 ostream& operator<<(ostream& stream, Stringtype s) 到 朋友 ostream& operator<<(ostream& stream, Stringtype& s)
取字符串s的引用
尝试初始化 str="",而不是 str='\0';