2014-12-03 3 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

ответ

2

strtok изменяет указатель температуры. Вам нужно удалить исходное значение указателя. (Сохраните его в переменной для этой цели.)

1

Вам необходимо присвоить temp_ptr значение strtok. Вы отбрасываете начало строки temp каждый раз, когда вы переназначаете temp.

tok_ptr = strtok(temp, ","); 

while(tok_ptr != NULL) 
{ 

// Вы, вероятно, хотите добавить подстроку между последним tok_ptr и следующего tok_prt tmpObject.add (температура, правда);

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

Проблема, связанная с утечкой памяти, - это strtok, как сказал ScottMcP-MVP.

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, ","); 
.... 
Смежные вопросы