2014-12-03 100 views
0

我收到一些內存泄漏valgrind與strtok,我不知道爲什麼會發生。內存泄漏與strtok

可能丟失:8個塊中的281個字節。

仍然可達:1個塊中有64個字節。

我也試着用臨時字符指針而不是getenv返回的那個函數調用函數,但是這並沒有幫助。

void parsePath(const char * line, vector<string> &pathing) { 

    if (line == NULL) 
     return; 
    char * s = strdup(line); 
    if (!s) 
     exit(1); 

    char * pch; 
    pch = strtok(s, ":"); 
    while (pch!=NULL) { 
     string tmp = string(pch); 
     pathing.push_back(tmp); 
     pch = strtok(NULL, ":"); 
    } 

    free(s); 
} 

我打電話給我的主要功能。

const char *pPath; 
    pPath = getenv("PATH"); 
    if (pPath == NULL) 
     perror("PATH"); 

    parsePath(pPath, pathing); 
+0

'pPath'和'line'應該是'const char *'('getenv'返回的字符串是不可修改的)。它應該是'string(pch)'(調用'string'構造函數),而不是'(string)pch'。你應該確保'strdup'返回一個非空指針。 – ooga 2014-12-03 04:52:18

+0

謝謝。我做了你所建議的修改,但是我仍然收到內存泄漏。有什麼我錯過了嗎? – 2014-12-03 04:58:39

+0

此代碼使用C++中STL的'vector',所以它不是C.標記需要從C改爲C++ – user3629249 2014-12-03 05:04:23

回答

0

這很可能是來自valgrind的誤報。

一般來說,內存泄漏在現代C++中並不是一個大問題,但是您明顯在使用舊式風格。如果您只使用std::string,例如Boost.Tokenizer,不會有任何泄漏。