现在的位置: 首页 > 综合 > 正文

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

2013年12月07日 ⁄ 综合 ⁄ 共 1058字 ⁄ 字号 评论关闭

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

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

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

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

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

http://baike.baidu.com/view/714962.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 如果读到\0 的时候,标志着字符串的结束,这个时候把\0也复制到strDestination里。

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

4.堆的结构与堆破坏

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

http://www.cnblogs.com/gesenkof99/archive/2009/04/14/1435642.html

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

抱歉!评论已关闭.