2013-03-20 73 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