C++中内存泄漏的可能原因

lingamang 2010-01-04 01:39:12
前几天面试的一道题,问C++中造成内存泄漏的原因都有哪些。
我当时只想到一种最常见的原因,就是动态分配的内存没有释放,比如new出一块内存,没有delete掉。相应的内存就会泄漏。
还有一种就是类没有析构函数,但类的析构函数是系统默认的,局部对象在生存周期结束之后会自动调用的。
所谓内存泄漏通常应该是指动态内存的泄漏,与静态和全局变量貌似也没有关系。
这里发帖讨论一下,大家也来想一想,看还有什么其他原因。
...全文
1682 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingamang 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 huiguixian 的回复:]
引用楼主 lingamang 的回复:
前几天面试的一道题,问C++中造成内存泄漏的原因都有哪些。
我当时只想到一种最常见的原因,就是动态分配的内存没有释放,比如new出一块内存,没有delete掉。相应的内存就会泄漏。
还有一种就是类没有析构函数,但类的析构函数是系统默认的,局部对象在生存周期结束之后会自动调用的。
所谓内存泄漏通常应该是指动态内存的泄漏,与静态和全局变量貌似也没有关系。
这里发帖讨论一下,大家也来想一想,看还有什么其他原因。


最简单的就是你说的动态用new分配,memory头文件中有个allocator类也是动态分配空间,但是不初始化,需要释放。
“还有一种就是类没有析构函数,但类的析构函数是系统默认的,局部对象在生存周期结束之后会自动调用的。”
楼主不知道3合1原则,默认合成的析构函数在只要有指针或者动态分配的时候,以及在信息交互的时候都是不满足的。针对内存泄露,当然是只要在类中有动态分配你就应该自己显示定义析构函数的操作,推荐看primer14和15章
[/Quote]

看了primer第14章,看来是原来自己没有理解清楚。
其实析构函数和内存泄漏并没有直接关系。类的析构函数并不是必须的。当类中的变量是按值存储时,无需析构函数,系统会在类的生命周期结束时自动释放对象成员的存储区。
一般情况下,类的对象离开生存域或者被delete掉时,系统会自动调用析构函数。
当类中有动态分配的资源时,需要自定义析构函数进行资源的释放。
同时,程序员可以在析构函数中任意定义自己需要完成的任务,比如数据统计,打印log之类的。
ypb362148418 2010-01-06
  • 打赏
  • 举报
回复
资源得不到释放,最后内存全废掉了,而CPU在等着释放
NewJerryj 2010-01-06
  • 打赏
  • 举报
回复
这些是我在实际工作项目中遇到过的一些内存问题,有些问题曾经花了我很长时间去解决
所以印象特别深刻。

[Quote=引用 24 楼 lovesi3344 的回复:]
哥们,你牛逼
我只知道第一种情况,本来想总结的,没想到你已经总结好了
我就拿来主义了,我希望你总结的都是正确的,然后我死记它
顶你

引用 20 楼 newjerryj 的回复:
1.new,malloc后没有delete,free

2.创建内核对象(比如CreateFile,CreateMutex,CreateThread),后没有释放内核对象句柄.

3.创建内存映射文件,CreateFileMapping,MapViewOfFile后没有CloseHandle(),UnMapviewofFile

4.创建GDI对象后,比如LoadIcon,LoadImage,CreateImageList等等,没有Destroy掉

5.创建DC后,比如GetDC(), 没有释放DC句柄

6.保留虚拟地址空间 VirtualAlloc(),然后提交物理存储器后,没有释放掉



[/Quote]
xwsn007 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 newjerryj 的回复:]
1.new,malloc后没有delete,free

2.创建内核对象(比如CreateFile,CreateMutex,CreateThread),后没有释放内核对象句柄.

3.创建内存映射文件,CreateFileMapping,MapViewOfFile后没有CloseHandle(),UnMapviewofFile

4.创建GDI对象后,比如LoadIcon,LoadImage,CreateImageList等等,没有Destroy掉

5.创建DC后,比如GetDC(), 没有释放DC句柄

6.保留虚拟地址空间 VirtualAlloc(),然后提交物理存储器后,没有释放掉


[/Quote]

这个强
lovesi3344 2010-01-06
  • 打赏
  • 举报
回复
哥们,你牛逼
我只知道第一种情况,本来想总结的,没想到你已经总结好了
我就拿来主义了,我希望你总结的都是正确的,然后我死记它
顶你

[Quote=引用 20 楼 newjerryj 的回复:]
1.new,malloc后没有delete,free

2.创建内核对象(比如CreateFile,CreateMutex,CreateThread),后没有释放内核对象句柄.

3.创建内存映射文件,CreateFileMapping,MapViewOfFile后没有CloseHandle(),UnMapviewofFile

4.创建GDI对象后,比如LoadIcon,LoadImage,CreateImageList等等,没有Destroy掉

5.创建DC后,比如GetDC(), 没有释放DC句柄

6.保留虚拟地址空间 VirtualAlloc(),然后提交物理存储器后,没有释放掉


[/Quote]
Contemplating 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yshuise 的回复:]
第一:忘记了释放。
第二:释放出错。
[/Quote]
解释一下第二点,释放出错其中一种情况,就是程序在运行到delete之前,程序出现的异常,而在catch块中为做相应释放的处理。
罗耗子 2010-01-05
  • 打赏
  • 举报
回复
也许还有派生类导致的基类泄露
NewJerryj 2010-01-05
  • 打赏
  • 举报
回复
1.new,malloc后没有delete,free

2.创建内核对象(比如CreateFile,CreateMutex,CreateThread),后没有释放内核对象句柄.

3.创建内存映射文件,CreateFileMapping,MapViewOfFile后没有CloseHandle(),UnMapviewofFile

4.创建GDI对象后,比如LoadIcon,LoadImage,CreateImageList等等,没有Destroy掉

5.创建DC后,比如GetDC(), 没有释放DC句柄

6.保留虚拟地址空间 VirtualAlloc(),然后提交物理存储器后,没有释放掉

时刻准备中 2010-01-05
  • 打赏
  • 举报
回复
new/malloc之后没有delete/free,这应该是本质。表现在现象上的有很多,如果用了一些第三方库,里面的一些操作从名字上看不出有new/malloc(如asn.1中的rtInitContext,这里就动态分配了内存),如果没有全面了解这些库函数的话(使用完之后,没有调用rtFreeContext),很容易造成内存泄露!
only_delusion 2010-01-05
  • 打赏
  • 举报
回复
1.new 没有 delete
2.malloc 没有 free 一般是链表的删除时 会出现
3.类的继承的时候 free掉的时候 析构函数没有调用全
我就知道这三种 应该还有很多.............
likee003 2010-01-05
  • 打赏
  • 举报
回复
1、new出一块内存,没有delete掉;
2、出现悬浮指针;
camelisi 2010-01-04
  • 打赏
  • 举报
回复
1.忘记了释放内存,造成内存泄露
2.用new新建了一个数组 但delete的时候少写了 [], 导致只释放了一个单位内存。

有种情况是忘记重新定义赋值函数或者拷贝构造函数,默认构造函数进行的是位拷贝
以类String的两个对象a,b为例,假设a.m_data的内容为“hello”,b.m_data的内容为“world“
现将a赋给b,缺省赋值函数的“位拷贝”意味着执行b.m_data = a.m_data
b.m_data原有的内存没被释放,造成内存泄露

lclhurricane 2010-01-04
  • 打赏
  • 举报
回复
gdi使用时没有释放资源,这个很普遍的
star_virgo 2010-01-04
  • 打赏
  • 举报
回复
还有malloc / calloc 没有 free
这是一般的情况
还有一些特殊的API调用的时候会出现内存泄露
像在linux下网络编程时(忘掉那个函数了),有个系统API
好像是获取套接口信息的
其返回是由系统创建的一个全局的数据类型
在用完后需要调用相应的释放API,否则就会内存泄露
相信在其他的API中也会有相同的情况吧
macrojj 2010-01-04
  • 打赏
  • 举报
回复
内存泄露。

根本原因就是new的没delete掉。

你说的是根本原因 不是情况吧
小小攻城师 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 lingamang 的回复:]
前几天面试的一道题,问C++中造成内存泄漏的原因都有哪些。
我当时只想到一种最常见的原因,就是动态分配的内存没有释放,比如new出一块内存,没有delete掉。相应的内存就会泄漏。
还有一种就是类没有析构函数,但类的析构函数是系统默认的,局部对象在生存周期结束之后会自动调用的。
所谓内存泄漏通常应该是指动态内存的泄漏,与静态和全局变量貌似也没有关系。
这里发帖讨论一下,大家也来想一想,看还有什么其他原因。

[/Quote]
最简单的就是你说的动态用new分配,memory头文件中有个allocator类也是动态分配空间,但是不初始化,需要释放。
“还有一种就是类没有析构函数,但类的析构函数是系统默认的,局部对象在生存周期结束之后会自动调用的。”
楼主不知道3合1原则,默认合成的析构函数在只要有指针或者动态分配的时候,以及在信息交互的时候都是不满足的。针对内存泄露,当然是只要在类中有动态分配你就应该自己显示定义析构函数的操作,推荐看primer14和15章
小布 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sunyeyi 的回复:]
从开机到关机,再开机,有内存泄露吗~~?
[/Quote]
内存没泄露,,检查下上衣口袋有没有泄露,如此躬身专注于关机事业。
小布 2010-01-04
  • 打赏
  • 举报
回复
我觉得产生了 wild pointer 也会导致内存泄露吧
加载更多回复(7)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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