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

时间:2015-04-16 21:09:02

标签: 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*()的方式工作。我做错了吗?

1 个答案:

答案 0 :(得分:7)

您忘了定义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;
}

因此,您在m_dataa中有两个指向同一b的指针,在main退出时,delete[]将被调用两次。