繁体   English   中英

转换构造函数

[英]Conversion constructor

谁能告诉我在调用构造函数后如何删除char *成员。

输出为“调试断言失败”

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";
}

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

s = "abc";

您最终得到两个String对象(其中一个是临时对象),该对象持有指向相同地址的指针。 他们都试图删除相同的对象。 您需要遵循三个规则

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

让我们分析s = "abc"

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

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

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

最后,临时String对象被销毁,并且由其m变量指向的内存被释放。 结果,您最终得到sm指向无效的内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM