今天我很无聊,我想创建自己的小字符串类。我非常喜欢.Net中的'System.String'类,它的分裂/替换/删除等功能,我想尝试实现它们。
然而我的问题是析构函数。如果我的字符串类的多个实例包含相同的字符串,那么当调用析构函数时,所有这些实例都会尝试删除[]相同的内存吗?
例如:
void DoSomething() {
MyStringClass text = "Hello!";
{
MyStringClass text2 = text;
// Do something with text2
} // text2 is destroyed, but so is the char* string in memory
// text now points to useless memory??
}
我理解这是对的吗?洛尔。
谢谢,
亚历
编辑:
哎呀,我忘了包含代码:
class string {
unsigned int length;
char* text;
public:
string() : length(0), text(NULL) { }
string(const char* str) {
if (!str) throw;
length = strlen(str);
text = new char[length];
memcpy(text, str, length);
}
~string() {
delete[] text;
}
};
答案 0 :(得分:1)
你是对的 - 两者都会尝试delete []
相同的内存块。
您没有为您的类定义复制构造函数,因此您将获得默认的复制构造函数,它会执行指针的浅层复制。
当text2
超出范围时,指针将为delete []
d。当text1
超出范围时,同一指针将再次delete []
d,导致未定义的行为。
有很多方法可以解决这个问题,最简单的方法是定义复制构造函数和赋值运算符。