内存操作不正确?

时间:2013-03-20 00:12:55

标签: c++ gcc

请帮助在此功能中找到错误。

wchar_t* clean(wchar_t out[], const wchar_t in[])
{
    int n = wcslen(in);
    wchar_t *str = new wchar_t[n];
    wcscpy(str, in);

    out[0] = L'\0';
    wchar_t *state;

    wchar_t *word = wcstok(str, L" ", &state);

    while (NULL != word) {
        if (wcslen(word) > 1) {
            wcscat(out, word);
            wcscat(out, L" ");
        }
        word = wcstok(NULL, L" ", &state);
    }

    delete state;
    delete[] str;
    return out;
}

此函数从原始字符串单词获取并将它们放在结果字符串中。 除了函数,忽略多个空格和单个字母的单词。

不幸的是,该程序落在此函数的最后几行,但错误相同(linux-3.7,gcc-4.7):

*** Error in `./a.out': free(): invalid next size (fast): 0x08610338 ***

请解释,我错了什么?

1 个答案:

答案 0 :(得分:8)

  1. 删除delete state;state不是指向动态内存的指针,因为您可以从没有分配给它的任何动态分配中看出。它只是指向现有字符串内某处的指针。

  2. 使用new wchar_t[n]修复缓冲区溢出;它没有空间来终止NULL。