分类: C/C++
2011-11-10 16:16:00
1. 指针没有指向一块合法的内存 常见的就是定义1个指针,但是没有为其指向一个合法的内存~~不用时“拴在”NULL;
2. 结构体成员指针未初始化
假如这么改
同样,我们并没有为name分配内存,
分配方法为
(sizeof,strlen初学的时候确实易混,马上写个博文)
三.内存越界问题
为指针分配内存,但是分配的不足出现越界行为
p1 是字符串常量,其长度为7 个字符,但其所占内存大小为8 个byte。初学者往往忘了字符串常量的结束标志“\0”。这样的话将导致p1 字符串中最后一个空字符“\0”没有被拷贝到p2 中。
解决的办法是加上这个字符串结束标志符:
注意这种形式
另外,不要因为char 类型大小为1 个byte 就省略sizof(char)这种写法。这样只会使你的代码可移植性下降。
越界另外常见的例子就是数组的边界,详见C 陷阱的 “边界不对称的章节”;
记住,定义完以后如果不确定其值,一定要对其进行初始化
四.内存泄露问题
会产生泄露的内存就是堆上的内存,内存泄露说白了就是用malloc或new后没有及时free或delete(注意之前说的,释放完毕后,立即对指针拴住,指向NULL)
只能通过指针变量p 来操作这块内存。这块内存本身并没有名字,对它的访问是匿名访问。
如果所申请的内存块大于目前堆上剩余内存块(整块),则内存分配会失败,函数返回NULL。
注意这里说的“堆上剩余内存块”不是所有剩余内存块之和,因为malloc 函数申请的是连续的一块内存。
既然malloc 函数申请内存有不成功的可能,那我们在使用指向这块内存的指针时,必
须用if(NULL != p)语句来验证内存确实分配成功了。
我们不能两次malloc,一次free,这样会造成内存泄露,同样,我们对一个malloc不能两次free,解释为下:
If a memory is freed twice, it will cause some unknown problems in somewhere later if it didn't crash at the second free。
关于用malloc分配0字节的内存:
申请0 字节内存,函数并不返回NULL,而是返回一个正常的内存地址。但是你却无法使用这块大小为0 的内存。这这时候if(NULL != p)语句校验将不起作用。
~~函数返回栈内存。这是初学者最容易犯的错误。比如在函数内部定义了一个
数组,却用return 语句返回指向该数组的指针。解决的办法就是弄明白栈上变量的生命周期。
32位的WIN平台下,不管申请 了多少空间都不会造成内存耗尽的现象,因为WIN使用的是虚拟内存,如果内存被申请完了就自动用硬盘代替了。所以如果申请了过分大的空间 ,可能你的硬盘就受着很大的压力了。
《UNIX环境高级编程》中第七章的一段话:
大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。
总之,内存申请和释放是个很复杂的问题,没有想想中的那么顺利~~
1.http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=824704
2.《c语言深度剖析》 林正冲