这个是什么情况,调试析构函数实现那里说发生断点

img

img

operator+()函数里调用strcat()函数把p1对象的字符串拷贝到p对象字符串结尾,导致p对象的字符串越界修改破坏堆数据。
你应该调用时strcpy函数,把p和p1的字符串都拷贝到t_str里,不过这里t_str有内存泄漏风险(如果调用函数没有释放返回的指针的话,比如在你的main函数里直接赋给str3了,所以t_str的内存没有被释放),你可以改为如下形式。这样实现比较低效,因为字符串拷贝了很多次。如果要提高效率,可以考虑如下一些优化,比如添加move构造函数/赋值运算符重载,实现copy-on-write语义等等

friend MyString operator + (const MyString &p1, const MyString &p2)
{
    int num = strlen(p1.m_str) + strlen(p2.m_str);
    char *t_str = new char[num+1];
    strcpy(t_str, p1.m_str);
    strcat(t_str, p2.m_str);
    MyString str(t_str);
    delete []t_str;
    return str;
}