c++用户定义的转换 - 隐式转换

标签 c++ type-conversion

<分区>

我对用户定义的转换有疑问。

class String {
    char* m_data;

public:
    String(): m_data(NULL) {}
    String(const char* cstr): m_data(new char[strlen(cstr)+1]) {
        strcpy(m_data, cstr);
    }
    ~String() {
        delete[] m_data;
    }
    String& operator=(const char* cstr) {
        delete[] m_data;
        m_data = new char[strlen(cstr)+1];
        strcpy(m_data, cstr);
        return *this;
    }
    operator const char*() const { 
        return m_data;
    }
};

虽然这有效:

int main(int argc, char** argv) {
    String a;
    String b;
    a = "aaa";
    b = (const char *)a;
    return 0;
}

这不是:

int main(int argc, char** argv) {
    String a;
    String b;
    a = "aaa";
    b = a;
    return 0;
}

我收到 double free or corruption 运行时错误。 Valgrind 说了一些关于无效删除的事情。

为什么我必须明确地对其进行类型转换?我认为它会以这种方式与 explicit operator const char*() 一起工作。我做错了什么吗?

最佳答案

你忘了定义 copy assignment operator :

String& operator=(const String& other) {
    if(this != &other) {
        char* new_data = new char[strlen(other.m_data)+1];
        strcpy(new_data, other.m_data);
        delete[] m_data;
        m_data = new_data;
    }
    return *this;
}

因为你的编译器必须定义“默认”复制赋值运算符,它简单地将“其他”的所有字段分配给当前对象:

String& operator=(const String& other) {
    m_data = other.m_data;
    return *this;
}

所以在 ab 以及 main 的导出处,您有两个指向相同 m_data 的指针, delete[] 将被调用两次。

关于c++用户定义的转换 - 隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29686018/

相关文章:

c++ - 计算以下算法的复杂性?

c# - 将 Int 类型转换为 Byte 类型

c++ - 由于删除了模板化左值转换运算符,clang 或 gcc 中可能存在错误?

spring-boot - Spring启动超时配置异常

c++ - 试图对两个编译时元组整数序列求和

c++ - Visual Studio-自动完成不起作用

c++ - Qt 模型 View 类中的意外行为

c# - 复合运算符隐式转换失败

oracle - 以下情况下 PLS_INTEGER 和 INTEGER 之间的区别

c++ - 重写比较运算符会带来哪些重大变化?