c++ map 内存泄漏

 

如果map,vector中存放了指针,指向手动分配的内存区域,则map,vector生命周期结束时,需要手动释放该内存区。

map,vector的析构中带有垃圾回收机制,不需手动清空。

 

记得,手动分配,才需手动清空。

 

c++ map指针的使用

    std::map<QString,QString> *abc;

    abc->insert(make_pair<QString,QString>("bads","dasddsa"));

    abc->insert(make_pair<QString,QString>("bads1","dasddsa1"));

    map<QString,QString>::iterator st;

    for(st=abc->begin();st!=abc->end();st++)

    {

        qDebug()<<st->first;

        qDebug()<<st->second;

    }

 

上述指针申明后,执行会有错误,修改为下:

    std::map<QString,QString> cc;

    std::map<QString,QString> *abc;

    abc=&cc;

    abc->insert(make_pair<QString,QString>("bads","dasddsa"));

    abc->insert(make_pair<QString,QString>("bads1","dasddsa1"));

    map<QString,QString>::iterator st;

    for(st=abc->begin();st!=abc->end();st++)

    {

        qDebug()<<st->first;

        qDebug()<<st->second;

    }

 

因为在申明指针的时候并没有申明存储空间,所以申明一个指针的时候,必须已经初始化对应的存储空间

 

来自 <https://www.cnblogs.com/ywliao/articles/8134357.html>

 

 

来自 <https://zhidao.baidu.com/question/468555186.html>

 

map存入结构体的指针和结构体本身有什么区别吗?

 

来自 <https://segmentfault.com/q/1010000012735414/a-1020000012748002>

 

一是存指针修改方便,直接使用map[0]的语法修改即可,不然就只能用中间变量整个struct重新赋值。

二是如果你的struct内容太多,建议map存指针,避免取用的时候反复拷贝。即使map[0]这种取法取出来也只是原struct的拷贝。

 

来自 <https://segmentfault.com/q/1010000012735414/a-1020000012748002>

 

 

如果map,vector中存放了指针,指向手动分配的内存区域,则map,vector生命周期结束时,需要手动释放该内存区。
map,vector的析构中带有垃圾回收机制,不需手动清空。
记得,手动分配,才需手动清空。

c++凡是手动分配的指针、内存 都需要手动进行释放 否则将会产生内存泄漏 以为内没有垃圾处理机制。

即使出现了内存泄漏,程序运行完所有的内存也都会释放。但是有的界面程序,如果有内存泄漏会在程序退出时弹出警告

一个结构体就是一个模板。所以说模板实在是太好用了。
定义宏为空 并没有实际意义 只是用来做判断、。

 

 

C/C++内存泄漏及检测

内存溢出就是内存越界。内存越界有一种很常见的情况是调用栈溢出(即stackoverflow),虽然这种情况可以看成是栈内存不足的一种体现。例如:递归调用栈;比如说C/C++标准库有个strcpy,会一直复制内存,直到遇到\0。;

内存泄漏就是内存申请后,用完没有释放,造成可用内存越来越少。

实际上很多内存泄漏对程序的运行不会有任何影响,有的内存泄漏,要连续不关机不重启电脑长达几十年的时间,才会被人觉察到。比如说电脑的内存有32GB,你程序分配了一块2KB的内存。而这块内存没有起任何作用,就一直放在那里。这就是内存泄漏的一种。有什么影响吗? 毫无影响。一般说内存泄漏是指分配了一块内存,用它存了一些东西,然后不再用它了,但并没有把这块内存释放掉。实际上只要程序退出了,不管泄漏不泄露,所有的内存一样会释放。

内存溢出比这严重多了。比如电脑有32GB的内存,32GB全用完了,这叫内存溢出。

不管内存泄漏与否,只要用了这么多内存,都会导致内存溢出。

.

“该死系统存在内存泄漏问题”,项目中由于各方面因素,总是有人抱怨存在内存泄漏,系统长时间运行之后,可用内存越来越少,甚至导致了某些服务失败。内存泄漏是最难发现的常见错误之一,因为除非用完内存或调用malloc失败,否则都不会导致任何问题。实际上,使用C/C++这类没有垃圾回收机制的语言时,你很多时间都花在处理如何正确释放内存上。如果程序运行时间足够长,如后台进程运行在服务器上,只要服务器不宕机就一直运行,一个小小的失误也会对程序造成重大的影响,如造成某些关键服务失败。

对于内存泄漏,本人深有体会!实习的时候,公司一个项目中就存在内存泄漏问题,项目的代码两非常大,后台进程也比较多,造成内存泄漏的地方比较难找。这次机会是我对如何查找内存泄漏问题,有了一定的经验,后面自己的做了相关实验,在此我分享一下内存泄漏如何调试查找,主要内容如下:

 

至于怎么发现内存泄漏  暂时不谈。因为事实上 很少用到。甚至于,我们的服务端的程序,是要每天重启,最多也要每周重启的。毕竟,一个程序很难长时间跑太久。

 

总结

其实内存泄漏的原因可以概括为:调用了malloc/new等内存申请的操作,但缺少了对应的free/delete,总之就是,malloc/new比free/delete的数量多。我们在编程时需要注意这点,保证每个malloc都有对应的free,每个new都有对应的deleted!!!平时要养成这样一个好的习惯。

要避免内存泄漏可以总结为以下几点:

  • 程序员要养成良好习惯,保证malloc/new和free/delete匹配;
  • 检测内存泄漏的关键原理就是,检查malloc/new和free/delete是否匹配,一些工具也就是这个原理。要做到这点,就是利用宏或者钩子,在用户程序与运行库之间加了一层,用于记录内存分配情况。
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值