0

我今天很无聊,我想创建自己的小字符串类。我真的很喜欢 .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;
    }
};
4

1 回答 1

1

你是对的——两者都会尝试delete []相同的内存块。

您没有为您的类定义复制构造函数,因此您将获得默认的构造函数,它执行指针的浅拷贝。

text2超出范围时,指针将为delete []d。当text1超出范围时,相同的指针将delete []再次为 d,导致未定义的行为。

有很多方法可以解决这个问题,最简单的方法是定义复制构造函数和赋值运算符。

于 2012-06-06T15:16:47.547 回答