大家好,今天小编关注到一个比较有意思的话题,就是关于内存泄露 c语言的问题,于是小编就整理了3个相关介绍内存泄露 c语言的解答,让一起看看吧。
初学者,c++std::string内存泄漏如何解决?
别人我不知道,但我的做法如下:
1.尽量不去手动分配内存。比如,我一般不使用数组,而使用STL的vector.
2.如果需要手动分配数组,尽量使用STL中的分配方式,或者使用STL和BOOST中的智能指针。
3.某些应用,比如MSXML,尽量使用智能指针。
4.凡是使用new和delete的地方,首先注意指针的初始化,然后要注意new和delete的配对,再就是要注意错误的捕捉。很多时候,内存泄漏不是因为new和delete的配对造成的,而是在自己没有考虑到的可能结果中,程序中断而没有delete手动分配的内存.
5.貌似有专门的方法来检测内存泄漏。不过我只听说过,没用过。
发生内存泄露时电脑的反应时什么样的?
只针对Java来说
内存泄露本意是申请的内存空间没有被正确释放,导致后续程序里这块内存被永远占用(不可达),而且指向这块内存空间的指针不再存在时,这块内存也就永远不可达了,内存空间就这么一点点被蚕食,借用别人的比喻就是:比如有10张纸,本来一人一张,画完自己擦了还回去,别人可以继续画,现在有个坏蛋要了纸不擦不还,然后还跑了找不到人了,如此就只剩下9张纸给别人用了,这样的人多起来后,最后大家一张纸都没有了。
内存溢出是指存储的数据超出了指定空间的大小,这时数据就会越界,举例来说,常见的溢出,是指在栈空间里,分配了超过数组长度的数据,导致多出来的数据覆盖了栈空间其他位置的数据,这种情况发生时,可能会导致程序出现各种难排查的异常行为,或是被有心人利用,修改特定位置的变量数据达到溢出攻击的目的。而JAVA中的内存溢出,一般指【OOM:发生位置】这种Error,它更像是一种内存空间不足时发生的错误,并且也不会导致溢出攻击这种问题,举例来说,堆里能存10个数,分了11个数进去,堆就溢出了1个数,JVM会检测、避免、报告这种问题,所以虽然实际上JVM规避了内存溢出带来的问题,但在概念上来说,它确实是溢出才导致的,只是J***a程序员在看到这个问题时,脑袋里的反应会是“内存不够了,咋回事,是不是又是哪个大对象没释放”之类,而不是像C程序员“我X被攻击了/程序咋写的搞溢出了”(这段是我臆想的)。同时对于J***a来说,传统意义的溢出攻击也无法奏效,因为J***a的数组会检查下标,对超出数组下标的赋值会报ArrayOutOfIndex错误。
而内存泄露的话,个人意见在J***a里是不存在的,gc***用根搜索算法时,不可达的对象会被回收,gc是会搜索回收这些空间的,由于程序员个人问题,没用的对象不回收但可达,这种情况能不能界定为内存泄露,我觉得是个哲学问题(对象可达,但空间被占用了,对象也不再使用了),个人觉得是不能界定为内存泄露的。
答完,个人水平有限,如果有错漏希望大家随意指正指教,多谢
gc机制原理和内存泄漏原因?
严格意义上的内存泄露的原因只有一种:没有释放向系统申请的内存,因为不申请内存,就谈不上什么泄露,搞清楚内存泄露的原因,应当从汇编语言的角度考虑问题。
当然没有释放内存的原因是多种的:
有可能是你自己代码写的不好,忘记了释放自己代码里申请的内存,
也有可能是你使用了一个写的不好的库,库本身有问题,这里说的库不仅仅是第三方库,甚至于各种语言的运行时库也有可能出现(再高的人都免不了出BUG),还甚至于操作系统的库,因为操作系统的BUG也多的很(当然系统一般情况不会出现这些低级的错误)。
到此,以上就是小编对于内存泄露 c语言的问题就介绍到这了,希望介绍关于内存泄露 c语言的3点解答对大家有用。