前言
小编相信各位道友在日常写C语言代码的时候肯定离不开动态内存的使用,但各位道友真的正确使用动态开辟的内存了么?因此本期小编将带领大家回顾C语言动态内存管理的常见六大错误。
1、对NULL指针的解引用操作
错误样例:
void test()
{
int* p = (int*)malloc(INT_MAX / 4);
*p = 20; //如果p的值是NULL,就会有问题
free(p);
}
分析:
对于开辟动态内存空间的函数,诸如malloc,calloc和realloc,他们在开辟空间失败的时候会返回空指针NULL,因此我们每次在使用开辟动态内存空间的函数的时候,我们都应该对返回值进行检验,避免后续出现对空指针的引用,而导致程序出错。
正确样例:
void test()
{
int* p = (int*)malloc(INT_MAX / 4);
//判断p是否为空指针
if (p == NULL)
{
return;
}
*p = 20;
free(p);
}
2、对动态开辟空间的越界访问
错误样例:
void test()
{
int i = 0;
int* p = (int*)malloc(10 * sizeof(int));
if (NULL == p)
{
return;
}
for (i = 0; i <= 10; i++)
{
p[i] = i; //当i是10的时候越界访问
}
free(p);
}
分析:
因为我们malloc开辟的空间为10个int类型的空间,因此当i为10的时候越界访问了,因此在使用动态开辟的内存空间的时候,要时刻关注开辟的内存大小以及注意访问的时候不要越界,否则程序会出现非常大的BUG。
3、对非动态开辟内存使用free释放
错误样例:
void test()
{
int a = 0;
int* p = &a;
free(p);
}
分析:
该样例中free释放了非动态开辟的内存空间p,而free这个函数就是释放动态开辟的内存空间的,不可以释放非动态开辟的内存空间,因此错误。而这个样例中可以清楚的察觉到free释放了非动态开辟的内存空间,这个我相信各位道友肯定不会犯这个错误,当当我们再写大型程序的时候,加上变量名的增多,我们就可能free释放非动态开辟的内存空间,因此需要我们提防。
4、使用free释放一块动态开辟内存的一部分
错误样例:
void test()
{
int* p = (int*)malloc(100);
if (p == NULL)
{
return;
}
p++;
free(p);//p已经不再指向动态内存的起始位置
}
分析:
当我们开辟好动态的内存空间后,不要轻易的改变指向动态内存首地址的指针的值,因为我们一旦改变后,其将不再指向动态内存的首地址,导致我们后续在free释放的时候无法释放完全,导致内存泄漏。
5、对同一块内存的多次释放
错误样例:
void test()
{
int i = 0;
int* p = (int*)malloc(10 * sizeof(int));
if (NULL == p)
{
return;
}
free(p);//第一次释放
for (i = 0; i < 10; i++)
{
p[i] = i;
}
free(p);//第二次释放
}
分析:
当我们第一次使用free释放掉开辟的动态内存后,该动态内存将归还给操作系统,因此在free释放掉后,任何对该动态内存的再使用都将是非法访问,同时第二次free的时候也会导致free函数出错,而导致程序无法正常运行,因此在使用动态内存开辟的时候要考虑清楚合适释放,同时杜绝多次释放。
6、内存泄漏(动态开辟内存忘记释放)
错误样例:
void test()
{
int* p = (int*)malloc(100);
if (NULL != p)
{
*p = 20;
}
}
分析:
因为test()函数中进行了动态内存开辟,但没有进行动态内存释放,因此在使用这个函数的时候就会占用内存空间,同时若反复使用这个函数,会导致内存最终被占用完,导致程序崩溃,因此一定要谨记动态开辟的内存空间要free释放。
总结
动态内存一定要合理使用,并且正确释放。
以上就是小编为大家总结的C语言动态内存管理的六大常见错误。制作不易,还请各位道友可以三连至此一下,后续会有更加精彩的内容。谢谢!!