一小段内存泄露代码,帮忙分析下哪里有问题

秀小川 2017-02-08 11:49:46

void listTest()
{
list<int*> lInt;
for (int i = 0; i < 1000; i++)
{
lInt.push_back(new int(i));
}
while (!lInt.empty())
{
int& m = *lInt.front();
std::cout << m << endl;
lInt.pop_front();
delete &m;
}
}

这个函数调用前后,程序占用内存多了100多K, 不知道是哪里有问题。
...全文
238 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2017-02-08
  • 打赏
  • 举报
回复
delete 后内存并不是立即归还系统的, 调用后内存增大并不表明就有内存泄露. 确认方法是在一个循环里面反复调用这个函数, 看内存是否持续增长.
www_adintr_com 2017-02-08
  • 打赏
  • 举报
回复
使用 WinDbg 可以跟踪堆里面泄露的内存, 以及这些泄露的内存是从哪里分配的, 参考 Windbg 的 !heap 命令以及 <<Windows 高级调试>> 的 9.5 节、第 6 章.
GKatHere 2017-02-08
  • 打赏
  • 举报
回复
如楼上, 1: 用模版库的自动管理 2: 在有new的地方马上放一个域守护 3: RAII

2: 在有new的地方马上放一个域守护
int* pi= new int();
SCP({delete pi;});
3: RAII
class PI
{
int* p;
PI() :p(new int()){};
~PI() {delete p;}
}

ri_aje 2017-02-08
  • 打赏
  • 举报
回复
最简单的方法就是别写内存泄漏的程序,如果你的程序都是像主楼这样 new/delete 满天飞的,那没有泄漏都是奇迹了。学会使用 raii 等设计模式。已经出现的只能一点一点排查,vs diff heap snapshots 可以帮助查找内存泄漏点。
秀小川 2017-02-08
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
delete 后内存并不是立即归还系统的, 调用后内存增大并不表明就有内存泄露. 确认方法是在一个循环里面反复调用这个函数, 看内存是否持续增长.
哦, 反复调用试了下,没有持续增长. 那这段代码应该是没有泄漏. 现在我的一个程序运行十几天以后内存占用多了100多M, 现在只能一点点代码去分析哪里泄漏了. 都要疯了. 有没有什么简单的方法判断哪里泄漏吗?

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧