任何人都可以告诉我在调用转换构造函数后如何删除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";
}
答案 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
指向无效的内存。