2017-06-22 79 views
-1

我在執行字符串標記化時面臨內存損壞和崩潰。第一次處理時不會發生崩潰。它需要一個多小時才能崩潰。所述problemmatic字符串標記化期間的內存損壞

wchar_t *query = new wchar_t[inQry.length() + 1]; 

    memset(query, NULL, inQry.length() + 1); 
    memcpy(query, inQry.c_str(), inQry.size()); 


    wchar_t *Tok = wcstok(query, L" "); 

    headStr = L""; 
    tableName = L"QUERY"; 

    while(Tok != NULL) 
    { 
     vectorSQLEntry.push_back(Tok); 
     Tok = wcstok(NULL, L" "); 
    } 

    int tokCount = vectorSQLEntry.size(); 
    if(query != NULL) 
    { 
    delete query; 
    } 

當與DebugDiag資料和分析中創建的轉儲diagonized,它指出在代碼中的一些其他線(有時行會delete query)。 所以我刪除了query作爲指針並聲明爲wstring。我刪除了headStrtableName之間的初始化 wcstok和while循環(代碼如下)。

wstring tmpQuery = inQry; 
wchar_t *Tok = wcstok((wchar_t*)tmpQuery.c_str(), L" "); 
while(Tok != NULL) 
{ 
    vectorSQLEntry.push_back(Tok); 
    Tok = wcstok(NULL, L" "); 
} 

使用此代碼不會發生崩潰。那麼初始代碼有什麼問題?這次事故讓我拖了兩天多。

+0

'vectorSQLEntry'持有什麼?什麼是確切的類型? – StoryTeller

+0

矢量的定義 - 矢量 vectorSQLEntry; –

+0

當你有內存損壞的問題時,你也應該證明Valgrind無法識別問題 - 否則它看起來好像你還沒有嘗試過。 –

回答

2

您的刪除語句應該是delete []query;我希望您在一段時間後內存不足並且可能導致新的失敗和崩潰。

0
if(query != NULL) 

查詢不能爲空,因爲如果失敗new會拋出異常。

wcstok((wchar_t*)tmpQuery.c_str(), L" "); 

您正在嘗試寫入只讀內存損壞的字符串。

+0

「您正在嘗試寫入只讀內存損壞的字符串。」 - 但有了這個代碼,我不知道會發生什麼事情。你的意思是,如果我在這一行之後訪問tmpQuery,我會得到一個異常? –

+0

@Sel_va從技術上講,沒有什麼能夠防止'wcstok'立即崩潰。你的代碼中不應該出現c樣式和const-cast。而這件作品絕對不需要任何演員。你也應該更新你的問題來包含[mvce](https://stackoverflow.com/help/mcve)。取決於'vectorSQLEntry'類型和之前/之後發生的任何事情,你可能會遇到不同的問題。 – VTT

+0

矢量的類型是wstring。我只用向量化的字符串填充矢量,然後搜索一個單詞並從該函數返回該單詞(wstring)。 –

0

我有同樣的問題,我找到了正確的方法來解決它。 您沒有正確初始化變量query。您的代碼是:

memset(query, NULL, inQry.length() + 1); 

第三個參數不正確。你應該修改它就像下面的代碼:

memset(query, NULL, (inQry.length() + 1) * sizeof(wchar_t)); 
... 
delete[] query; 

然後它會正常工作。