【问题标题】:Memory leak despite freeing allocated memory尽管释放了分配的内存,但内存泄漏
【发布时间】:2014-12-03 18:05:58
【问题描述】:

我有一个 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)

【问题讨论】:

  • 可以jsonObject.add扔吗?

标签: c++ memory-leaks valgrind


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    tok_ptr = strtok(temp, ",");
    
    while(tok_ptr != NULL)
    {
    

    //你可能想在最后一个 tok_ptr 和下一个 tok_prt 之间添加子字符串 tmpObject.add(temp, true);

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

    【讨论】:

      【解决方案3】:

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

      避免此类泄漏的 C++ 方法是使用众多 std 助手之一: auto_ptr/unique_ptr,向量。为什么不是字符串?

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

      【讨论】:

        猜你喜欢
        • 2012-01-25
        • 2016-11-03
        • 2015-12-26
        • 2015-01-30
        • 1970-01-01
        • 2011-06-23
        • 2012-06-08
        • 1970-01-01
        • 2011-01-27
        相关资源
        最近更新 更多