moon19961996 2019-04-11 15:31 采纳率: 66.7%
浏览 228
已采纳

s1=s2,这行之后调用析构函数析构了s2,并且报错,为什么

 class String
{
public:
    String(const char *str = NULL);
    ~String();
    void print();
    void operator =(const char*str);
    void operator =(String str);

private:
    char *m_str;
};

void String ::operator=(const char*str)
 {
    int len = strlen(str);
    m_str = new char[len + 1];
    strcpy_s(m_str, len + 1, str);
 }

void String ::operator=(String str)
{
    int len = strlen(str.m_str);
    m_str = new char[len + 1];
    strcpy_s(m_str, len + 1, str.m_str);
}

String::String(const char *str)
{
    if (str == NULL)
    {
        m_str = new char[1];
        m_str = '\0';
    }
    else
    {
        int len = strlen(str);
        m_str = new char[len + 1];
        strcpy_s(m_str,len+1,str);
    }

}
String::~String()
{
    cout << "析构"<<m_str<<endl;
    if(m_str==NULL)
    {
        return;
    }
    delete[]m_str;
    m_str = NULL;
}

void String::print()
{
    cout<<m_str<<endl;
}

int main()
{
    String s1("abcde");
    s1.print();
    s1 = "123456";
    s1.print();
    String s2 = "321";
    s1 = s2;
    s1.print();

    return 0;
}
  • 写回答

2条回答 默认 最新

  • threenewbee 2019-04-11 19:45
    关注
    #include <iostream>
    using namespace std;
    
    class String
    {
    public:
        String(const char *str = NULL);
        String(const String& str)
        {
            int len = strlen(str.m_str);
            m_str = new char[len + 1];
            strcpy_s(m_str, len + 1, str.m_str);
        }
        ~String();
        void print();
        void operator =(const char*str);
        void operator =(String str);
    
    private:
        char *m_str;
    };
    
    void String ::operator=(const char*str)
     {
        int len = strlen(str);
        m_str = new char[len + 1];
        strcpy_s(m_str, len + 1, str);
     }
    
    void String ::operator=(String str)
    {
        int len = strlen(str.m_str);
        m_str = new char[len + 1];
        strcpy_s(m_str, len + 1, str.m_str);
    }
    
    String::String(const char *str)
    {
        if (str == NULL)
        {
            m_str = new char[1];
            m_str = '\0';
        }
        else
        {
            int len = strlen(str);
            m_str = new char[len + 1];
            strcpy_s(m_str,len+1,str);
        }
    
    }
    String::~String()
    {
        cout << "析构"<<m_str<<endl;
        if(m_str==NULL)
        {
            return;
        }
        delete[]m_str;
        m_str = NULL;
    }
    
    void String::print()
    {
        cout<<m_str<<endl;
    }
    
    int main()
    {
        String s1("abcde");
        s1.print();
        s1 = "123456";
        s1.print();
        String s2 = "321";
        s1 = s2;
        s1.print();
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料