问题描述
我们有一个像下面这样的“条目”类和带有一组条目的标准映射。最后,我们清理了地图,但 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*,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 仍然报告可能的泄漏?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)