一个隐藏的内存泄漏BUG

编写了一个闪烁对象FlashObj,有两个接口add和draw:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

class FlashObj
{
std::map<size_t, FlashItem*> m_items;

public:
size_t add(FlashItem* item){
LOCK;
size_t key = m_items.size();
m_items[key] = item;
return key;
}

void draw(){
LOCK;
auto iter = m_items.begin();
while (iter != m_items.end()){
if (iter->second->actived()){
iter->second->step();
iter->second->draw();
}
else{
delete iter->second;
iter = m_items.erase(iter);
}
}
}
};

在绘制的时候,绘制周期结束后自动删除元素。但是一运行发现存在内存泄漏,根源在于add时使用的key是当前元素的个数,但是这个key对应的元素有可能并没有被删除,这时候加入就会覆盖掉原有的FlashItem导致内存泄漏。

看起来delete和add似乎是对应上的,但是实际上有泄漏。