2013-03-20 48 views
1

请帮助查找此功能中的错误。错误的内存操作?

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 *** 

说明,请在我弄错了?

+3

'str'不包含终止'NULL'字符足够的空间。 – timrau 2013-03-20 00:17:17

+0

@timrau优秀的捕获。 – 2013-03-20 00:18:50

回答

8
  1. 删除delete state;state不是指向动态内存的指针,您可以从分配给它的任何动态分配的缺失中知道。它只是一个指向现有字符串内某处的指针。

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

+1

并用'new wchar_t [n]'修复缓冲区溢出 - 没有终止NULL的空间。 – 2013-03-20 00:19:29

+0

我已经试过了。唉,它没有帮助。 – 2013-03-20 00:19:43

+0

@NikBougalis,谢谢。我真的很愚蠢。 – 2013-03-20 00:23:39