社区
C++ 语言
帖子详情
C++中内存泄漏的可能原因
lingamang
2010-01-04 01:39:12
前几天面试的一道题,问C++中造成内存泄漏的原因都有哪些。
我当时只想到一种最常见的原因,就是动态分配的内存没有释放,比如new出一块内存,没有delete掉。相应的内存就会泄漏。
还有一种就是类没有析构函数,但类的析构函数是系统默认的,局部对象在生存周期结束之后会自动调用的。
所谓内存泄漏通常应该是指动态内存的泄漏,与静态和全局变量貌似也没有关系。
这里发帖讨论一下,大家也来想一想,看还有什么其他原因。
...全文
1682
27
打赏
收藏
C++中内存泄漏的可能原因
前几天面试的一道题,问C++中造成内存泄漏的原因都有哪些。 我当时只想到一种最常见的原因,就是动态分配的内存没有释放,比如new出一块内存,没有delete掉。相应的内存就会泄漏。 还有一种就是类没有析构函数,但类的析构函数是系统默认的,局部对象在生存周期结束之后会自动调用的。 所谓内存泄漏通常应该是指动态内存的泄漏,与静态和全局变量貌似也没有关系。 这里发帖讨论一下,大家也来想一想,看还有什么其他原因。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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块中为做相应释放的处理。
honghu069
2010-01-05
打赏
举报
回复
http://baike.baidu.com/view/1068433.htm?fr=ala0_1_1
罗耗子
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
打赏
举报
回复
http://www.abcdown.net/InfoView/Article_199275.html
小布
2010-01-04
打赏
举报
回复
[Quote=引用 6 楼 sunyeyi 的回复:]
从开机到关机,再开机,有内存泄露吗~~?
[/Quote]
内存没泄露,,检查下上衣口袋有没有泄露,如此躬身专注于关机事业。
小布
2010-01-04
打赏
举报
回复
我觉得产生了 wild pointer 也会导致内存泄露吧
加载更多回复(7)
windows下
c++
内存泄露检测工具使用方
windows下
c++
内存泄露检测工具使用方windows下
c++
内存泄露检测工具使用方
C++
内存泄露检测器
C++
内存 泄露 检测器 对于一个c/
c++
程序员来说,
内存泄漏
是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题
几个
内存泄漏
的例子
几个
内存泄漏
的例子 new和delete要成对使用...经常看到一些
C++
方面的书籍
中
这样提及到
内存泄漏
问题,这样的说法的意思是比较明白,但对于初学
C++
程序员还是很难掌握,所以下面举几个反面的例子,希望对大家有帮助。
浅谈C_
C++
内存泄漏
及其检测工具
浅谈C_
C++
内存泄漏
及其检测工具, 对C/
C++
的内存泄露做了简洁的介绍, 并介绍了检测方法和工具.
C++
内存泄漏
检测原理+代码
C++
内存泄漏
检测原理的文档,包括代码,东东来自网络,我亲自整理,欢迎下载。
C++ 语言
64,646
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章