C动态内存分配:(三)malloc/calloc/realloc/free使用注意事项

1、使用前要检查所请求的内存是否成功分配。

2、操作内存时不要超出分配边界。

3、使用sizeof计算数据类型的长度,有助于提高程序的可移植性。

4、传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。传给free函数一个指针,让它释放一块并非动态分配的内存可能会导致程序立即终止或在晚些时候终止。free一个NULL指针,不执行任何操作。

5、试图调用free释放一块动态分配内存的一部分也会导致程序立即终止或在晚些时候终止,动态分配的内存必须整块一起释放(realloc可以缩小一块动态分配的内存,有效地释放它尾部的部分内存)。

6、不要访问已经被free函数释放了的内存。主要是要防止当对一个指向动态分配的内存的指针进行了复制,而这个指针的拷贝散布在程序各处。使用其中一个指针时要确保它所指的内存没有被别的指针释放。

7、C++不允许将 一个void*类型指针赋给任何其它指针。因此在C++中使用malloc时,必须要做类型转换。

8、连续调用内存分配函数分配的存储空间的顺序和邻接是不确定的。

9、C内存分配函数分配的对象有分配存储期限。这些对象的生存期并不限定于创建它的范围内,因此在任何一个函数内调用malloc(),函数返回后,已分配的内存依然存在。

10、对于realloc不要将返回结果再赋值给原指针,即ptr=realloc(ptr,new_size)是不建议使用的,因为如果内存分配失败,ptr会变为NULL,如果之前没有将ptr所在地址赋给其他值的话,会发生无法访问旧内存空间的情况,所以建议使用temp=realloc(ptr,new_size)。

11、传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的,或者为NULL

12、realloc的size小于原来的内存块大小时,会造成数据丢失。size大于原来的内存大小时,可能会重新分配内存,因此原来的指针ptr指向的旧内存会被free掉,因此不可以再使用ptr取原来内存中的数据,应该改用realloc返回的新指针。

13、因为动态内存分配可能会失败,因此对每次返回的指针都进行检查确保它并非NULL非常重要。

14、调用calloc()时,要确保参数相乘时不会超过类型大小而变为负数。(最好室友unsigned int或者size_t类型)


参考文献:

1、《C程序设计语言》

2、《C和指针》

3、《C和C++安全编码》


你可能感兴趣的:(C)