转换构造函数

时间:2014-08-25 09:40:55

标签: c++ casting type-conversion destructor

任何人都可以告诉我在调用转换构造函数后如何删除char *成员。

输出是Debug Assertion Failed

class String
{
public:
    char* m;
    String()
    {
        m = NULL;
    }
    String(const char* str)
    {
        m = strdup(str);
    }
    String(const String& I)
    {
        m = strdup(I.m);
    }
    ~String()
    {
        delete m;
    }
};


void main()
{
    String s;
    s = "abc";
    s = "bcd";
}

2 个答案:

答案 0 :(得分:4)

问题是您尚未实现赋值运算符。所以当你这样做时

s = "abc";

最终得到两个String个对象(其中一个是暂时的),指向同一个地址。他们都试图删除同一个对象。您需要关注the rule of three

注意:正如@kolrabi指出的那样,您应该在分配有free的指针上调用strdup,而不是delete

答案 1 :(得分:1)

让我们分析s = "abc"

首先,这是一个赋值,而不是实例化,因为s已经被声明了。

因此,编译解决方案是创建一个临时String对象,"abc"作为String构造函数的参数,然后调用String赋值运算符为了将该临时对象复制到s

现在,由于您尚未为此类实现赋值运算符,因此将调用默认赋值运算符,并将每个成员变量从临时String对象复制到s。< / p>

最后,临时String对象被销毁,其m变量指向的内存被释放。结果,最终导致s.m指向无效的内存。