C++ 释放已分配内存时仍存在内存泄漏

C++ 释放已分配内存时仍存在内存泄漏,c++,memory-leaks,valgrind,C++,Memory Leaks,Valgrind,我有一个常量字符*需要用逗号分割。因为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 =

我有一个常量字符*需要用逗号分割。因为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)

strtok修改临时指针。您需要删除原始指针值。(为此,请将其保存在变量中。)

您需要为strtok值分配一个temp_ptr。每次重新分配temp时,都会丢弃temp字符串的开头

tok_ptr = strtok(temp, ",");

while(tok_ptr != NULL)
{
//您可能希望在最后一个tok_ptr和下一个tok_prt之间添加子字符串 tmpObject.add(临时,真)


正如ScottMcP MVP所说,导致内存泄漏的问题是strtok

<> P>避免这种泄漏的C++方法是使用许多STD助手之一: 自动搜索/唯一搜索,向量。为什么不是一根绳子

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

是否可以
jsonObject.add
throw?
std::string copy(iter.getColumnText(ApDbData::AP_IDX_TYPE_80211);
copy.append('\0');
char *temp = &copy[0];
temp = strtok(temp, ",");
....