1

我有这个运算符重载器。我的程序在创建新wchar_t数组时崩溃。

myObject &operator += (const myObject &s) {
    wchar_t *cat = wcscat(data, s.data);
    int len = wcslen(cat);
    wchar_t *test = new wchar_t[len + 1]; //this is killing!
    wcscpy(test, cat);

    delete data;
    data = test;

    return *this;
}

有人知道发生了什么吗?

编辑完整的类定义

class myObject
{
    private:
        wchar_t *data;
    public:
        myObject() { data = 0; }
        ~myObject() { delete data; }

        myObject &operator += (const myObject &s) {
            wchar_t *cat = wcscat(data, s.data);
            int len = wcslen(cat);
            wchar_t *test = new wchar_t[len + 1];
            wcscpy(test, cat);

            delete data;
            data = test;

            return *this;
        }
};
4

2 回答 2

3

这段代码至少包含两个相当明显的问题:

  1. 您显然使用分配数据,但您使用而不是使用new wchar_t[n]释放它。delete pdelete[] p
  2. 问题的可能原因是您将两个字符串连接到一个字符串的内存中,然后分配足够的内存来复制数据。

你可能想要更多类似的东西:

myObject &operator += (const myObject &s) {
    size_t len = wcslen(this->data) + wcslen(s.data);
    std::unique_ptr<wchar_t[]> tmp(new wchar_t[len + 1]);
    wcscpy(tmp.get(), this->data);
    wcscat(tmp.get(), s.data);
    delete[] this->data;
    this->data = tmp.release();
    return *this;
}

实际上,我认为您想使用std::wstring:此类已经提供了逻辑,无论如何可能以更有效的形式。

于 2012-11-10T14:56:16.793 回答
2

正如 Dietmar 所说(但更详细地说明了幕后可能发生的事情):

1) 调用wcscat(data, s.data)已超出 指向的缓冲区的末尾data。如果它没有溢出,那么你就不需要分配一个新的缓冲区,因为现有的缓冲区已经足够大了。我预计它还不够大。

2) 由于缓冲区溢出,内存分配器使用的数据结构被丢弃。当您尝试分配内存时,这会导致崩溃。当您释放内存时,它很容易导致崩溃,或者根本不会崩溃。

于 2012-11-10T15:02:50.570 回答