c++ - 使用 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 也会报告可能的泄漏?
解决方案
推荐阅读
- mysql - 我正在尝试在 sql 中运行查询,在其中将字段更改为小写以使其一致并对不同字段求和
- javascript - 使用 Vue 进行 Firestore 分页
- java - 双击 .jar 文件时程序无法正常运行
- javascript - Javascript Map 函数是异步的吗?
- html - 即使在滚动时,也使侧边栏(在 React 中)占据页面高度的 100%
- regex - 相同的模式 Apper 多个时间捕获全部使用 gawk
- php - 提交前填充的 PHP `POST`
- angular - 服务变量和数据的角度变化检测
- r - 使用 Tukey 检验校正效果
- javascript - 如何在基本 html 模板中使用 {% load staticfiles%} 导入 js 文件