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;
}
#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;
}

void String ::operator=(String str); 这个函数参数不是引用类型 所以会调用函数的默认拷贝构造函数生成临时对象,由于你未实现拷贝构造函数所以存在深拷贝浅拷贝问题
s1=s2调用完后会释放临时变量就会调用析构函数,此时s2的成员变量m_str已经被释放了,所以main函数结束时s2生命周期结束调用析构函数会出现问题
而且在你重载等号的函数中应该要先释放之前的内存再new新内存
仅供参考,不敢保证一定对