首页 > 解决方案 > 使用 strdup 指针作为映射键会导致内存泄漏

问题描述

我们有一个像下面这样的“条目”类和带有一组条目的标准映射。最后,我们清理了地图,但 valgrind 显示通过 strdup 函数分配的内存可能存在泄漏。

class Entry
{
public:
    char* m_key;
    t m_data;

    Entry(const char* key, t data)
    {
        m_key= strdup(key);
        m_data = data;
    }

    ~Entry()
    {
        free((void*)m_key);
        m_key = nullptr;
        delete m_data;
        m_data = nullptr
    }
};

将元素插入地图

std::map<const char*, Entry*, Predicate> map_Entries;

void Insert(const char* key, t data)
{
   Entry *pNewEntry = new Entry(key, data);
   map_Entries.insert(std::pair<const char*, Entry*>(pNewEntry->m_key, pNewEntry));
}

从地图中清除元素

void Clear()
{
  typename std::map<const char*, Entry*, Predicate>::iterator it;
    for(it = map_Entries.begin(); it != map_Entries.end(); it++)
        delete (*it).second;

    map_Entries.clear();
}

谓词是比较运算符,如下所示。

struct Mapcasestr
{
  bool operator()(const char* s1, const char* s2) const { return strcasecmp(s1, s2) < 0; }
};

Valgrind 问题

==5666==    at 0x4C29BC3: malloc (vg_replace_malloc.c:299)
==5666==    by 0x8098AF9: strdup (in /usr/lib64/libc-2.17.so)
 ==5666==    by 0x4E92B1: Entry::Entry(char const*, T*) 

我知道使用原始指针作为映射键不是一个好习惯,我们有比 strdup 更好的选择。但这是一个旧代码库,我正在尝试修复那里的内存泄漏。我想知道的是为什么即使我们释放了通过 strdup 函数分配的内存,valgrind 也会报告可能的泄漏?

标签: c++memory-leaksvalgrindstrdup

解决方案


推荐阅读