C++ 为什么我会得到一个运行时间,上面写着;在tcache 2中检测到双自由度”;

C++ 为什么我会得到一个运行时间,上面写着;在tcache 2中检测到双自由度”;,c++,operator-overloading,C++,Operator Overloading,我正在编写自己的字符串类,为了方便起见,我重载了一些运算符。但我在使用这些重载运算符时遇到了一个问题 以下是驾驶员代码: String str1 {"Hello"}; String str2 {"World"}; String str3 = str1 + str2; 上面的驱动程序代码编译得很好,但在执行二进制代码时产生了以下错误: free(): double free detected in tcache 2 Aborted (core dumpe

我正在编写自己的字符串类,为了方便起见,我重载了一些运算符。但我在使用这些重载运算符时遇到了一个问题

以下是驾驶员代码:

String str1 {"Hello"};
String str2 {"World"};

String str3 = str1 + str2;
上面的驱动程序代码编译得很好,但在执行二进制代码时产生了以下错误:

free(): double free detected in tcache 2
Aborted (core dumped)
当我对驱动程序代码的最后一行进行注释时,文件编译并执行得很好。显然,问题出在第三行,我尝试使用重载+运算符,这是为了方便连接。但我仍然无法准确地指出问题所在

以下是析构函数的代码:

String::~String() {
    if(this->str != nullptr)
        delete [] this->str;
}
下面是重载+运算符的代码:

// + overloaded for concatenation of strings
String String::operator+(String &rhs) {
    char *temp_str;
    temp_str = new char[std::strlen(this->str) + std::strlen(rhs.str) + 1];
    temp_str = std::strcat(str, rhs.str);
    String temp_obj {temp_str};
    delete [] temp_str;
    return temp_obj;
}
以下是施工人员:

// Default constructor
String::String(): String(nullptr) {}

// Parameterised constructor
String::String(const char *s): str {nullptr} {
    if(s == nullptr) {
        str = new char;
        *str = '\0';
    }
    else {
        str = new char[std::strlen(s) + 1];
        std::strcpy(str, s);
    }
}
我还重载了用于复制和移动对象的=操作符。实施情况如下:

// = overloaded to copy a String object
String& String::operator=(const String &rhs) {
    if(this == &rhs)
        return *this;

    delete [] str;
    str = new char[std::strlen(rhs.str) + 1];
    std::strcpy(str, rhs.str);

    return *this;
}


// = overloaded to move a String object
String& String::operator=(String &&rhs) {
    if(this == &rhs)
        return *this;

    str = rhs.str;
    rhs.str = nullptr;

    return *this;
}

我很确定这个
std::strcat(str,rhs.str)将调用UB。它还将创建内存泄漏,检查实际问题可能是由于未正确实现。但是我们不能100%肯定没有一个。请出示一个我相信@churill已经搞定了。它应该是strcat(strcpy(temp_str,str),rhs.str)而不是
temp_str=std::strcat(str,rhs.str)。否则1
str
可能是越界使用的,2
temp_str
设置为(中的地址)
str
,而刚刚分配的内存丢失(并成为泄漏)。至少,2。是双重删除的一个可以想象的原因。确切地说,@churill说的->你用错了。请按照churill提供的链接访问。然后再次阅读我的简要说明,解释我上面已经给出的实现出错的原因。;-)<代码>标准::strcat()
不分配内存。它要求调用者在第一个参数中提供足够的内存。(这是再次返回的内容-只是为了像我一样允许嵌套。)因此,
temp_str
必须是第一个参数中给出的内容(并且对
temp_str
的赋值充其量是无用的,充其量是像您的情况一样损坏的代码。)