程序崩溃复制构造函数

时间:2017-11-21 11:03:25

标签: c++ copy-constructor

我正在测试以下代码:

 #include<bits/stdc++.h>
 using namespace std;
 class Stringtype{
     char* str;
     int length;
     public:
     Stringtype(){
         str='\0';
         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;
 }

此代码生成以下输出(在正确输入后):

构造

然后崩溃。

我似乎无法理解为什么......

非常感谢任何帮助。谢谢。

3 个答案:

答案 0 :(得分:4)

您永远不会为字符串的内部内存表示保留内存。您需要在某个地方{/ 1}} 。否则你将写入你不拥有的内存,这正是这里发生的事情,就在你观察到的输出之后的下一行。

顺便说一句:这里应该没有复制结构,你的签名

new

应为:

friend ostream& operator<<(ostream& stream, Stringtype s){

虽然不会改变你的内存处理错误这一事实。

答案 1 :(得分:0)

请更改以下内容 朋友ostream&amp;运算符&lt;&lt;(ostream&amp; stream,Stringtype s) 至 朋友ostream&amp;运算符&lt;&lt;(ostream&amp; stream,Stringtype&amp; s)

获取字符串s

的参考

答案 2 :(得分:0)

尝试初始化str =“”,而不是str ='\ 0';