请帮助在此功能中找到错误。
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 ***
请解释,我错了什么?
答案 0 :(得分:8)
删除delete state;
。 state
不是指向动态内存的指针,因为您可以从没有分配给它的任何动态分配中看出。它只是指向现有字符串内某处的指针。
使用new wchar_t[n]
修复缓冲区溢出;它没有空间来终止NULL。