内存泄露,缓冲区溢出,堆破坏 的问题

阅读: 评论:0

内存泄露,缓冲区溢出,堆破坏 的问题

内存泄露,缓冲区溢出,堆破坏 的问题

今天在用c语言写socket的AES加解密的时候,由于是直接操作内存,错误百出,调了整整三天才把加解密的问题给搞出来。。。。整死我了。。。

总结一下,是自己使用malloc动态分配内存不当,没有掌握sizeof 的用法, 还有没有深刻理解strcpy, strcat函数导致的。

1.使用malloc动态分配内存之后,一定要把内存free掉,然后指向NULL,不然会造成内存泄露

一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

关于内存泄露,这里介绍了一个有趣的关于电梯程序中内存泄露的真实例子:

.htm


2.有下面这样的例子:

char* str1 = (char *) malloc(10);int size1 = sizeof(str1);char str2[10];int size2 = sizeof(str2);

这里的size1 = 4    size2 = 10 

因为sizeof(str1)是把 str1当成是指针类型的,由于指针是一个32位的整数(win32下面),所欲size1 = 4;

而sizeof(str2)传入的是整个字符串,所以size2 是字符串的长度


3.关于strcpy 的函数原型:

char *strcpy(char *strDestination,const char *strSource 
);

把后者的字符串copy到前者。那么怎么判断结束了呢?strSource 如果读到 的时候,标志着字符串的结束,这个时候把也复制到strDestination里。

如果不想把最后的复制到前者,可以使用CopyMemory函数。但是使用这个函数的时候要注意内存越界的问题。


4.堆的结构与堆破坏

简单的可以这样理解吧 。你malloc申请一块内存的时候,有头结点,你的内存块,尾结点。当你写入堆的大小大于你申请内存块的大小事,尾结点的指针被覆盖了,这个时候堆就被破坏了。

.html



上面这些错误会导致像内存泄露,缓冲区溢出,堆破坏等情况。使用的时候应该小心


本文发布于:2024-02-03 08:44:00,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170692103849919.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:缓冲区   内存
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23