2014-12-03 102 views
1

我有一個const char *,我需要用逗號分開。因爲strtok修改了輸入字符串,所以我複製它,並在函數結尾釋放分配的內存。內存泄漏,儘管釋放分配的內存

void ApBuilder::addNetworkType(ApDbData::RowIterator &iter) 
{ 
    const char * type = iter.getColumnText(ApDbData::AP_IDX_TYPE_80211); 

    const size_t len = strlen(type); 
    char * temp = new char[len +1]; 
    strncpy(temp, type, len); 
    temp[len] = '\0'; 

    temp = strtok(temp, ","); 

    while(temp != NULL) 
    { 
     tmpObject.add(temp, true); 

     temp = strtok(NULL, ","); 
    } 

    jsonObject.add("type80211", tmpObject); 

    delete[] temp; 
} 

Valgrind抱怨說,儘管我釋放了分配的內存,但仍有內存泄漏。我該如何解決此漏洞

==17667== 8 bytes in 2 blocks are definitely lost in loss record 1 of 4 
==17667== at 0x402ADFC: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==17667== by 0x8049C5D: ApBuilder::addNetworkType(AbstractDbData::RowIterator&) (in /home/***/workspace/projects/jsonBuilder/main) 
==17667== by 0x8049A38: ApBuilder::buildApArray() (in /home/***/workspace/projects/jsonBuilder/main) 
==17667== by 0x8049679: main (in /home/***/workspace/projects/jsonBuilder/main) 
+0

'jsonObject.add'可以拋出嗎? – Deduplicator 2014-12-03 18:10:04

回答

2

strtok修改臨時指針。您需要刪除原始指針值。 (爲此將它保存在一個變量中。)

1

您需要爲strtok值指定temp_ptr。每當您重新指定temp時,您都會放棄臨時字符串的開始。

tok_ptr = strtok(temp, ","); 

while(tok_ptr != NULL) 
{ 

//你可能想添加最後tok_ptr和明年tok_prt之間的子 tmpObject.add(溫度,真正的);

tok_prt = strtok(NULL, ","); 
} 
0

ScottMcP-MVP說,導致內存泄漏的問題是strtok。

C++避免此類泄漏的方法是使用衆多std幫助程序之一: auto_ptr/unique_ptr,vector。爲什麼不是字符串?

std::string copy(iter.getColumnText(ApDbData::AP_IDX_TYPE_80211); 
copy.append('\0'); 
char *temp = &copy[0]; 
temp = strtok(temp, ","); 
....