程序崩溃在复制构造函数上

Program crash on copy constructor

本文关键字:构造函数 复制 崩溃 程序      更新时间:2023-10-16

我有以下代码我正在测试:

 #include<bits/stdc++.h>
 using namespace std;
 class Stringtype{
     char* str;
     int length;
     public:
     Stringtype(){
         str='';
         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&amp;操作员&lt;&lt;(ostream&amp; stream,stringType s)到朋友Ostream&amp;操作员&lt;&lt;(ostream&amp; stream,stringType&amp; s)

请参考字符串S

尝试初始化str =",而str =' 0';