常见的动态内存错误
文章目录
前言
我们在动态内存开辟的时候,偶尔会写出一些bug,但是这些bug都是什么呢?在什么情况
我们会写出bug呢?在这里有哪些易错的点呢?我们应该如何避免写出bug呢?本篇文章,我会给大家介绍动态内存管理中常见的六个应该注意的问题。
一、对NULL指针的解引用操作
代码如下(示例):
int main()
{
int* p = malloc(1000);
int i = 0;
for (i = 0; i < 250; i++)
{
*(p + i) = i;
}
return 0;
}
在这段代码中如果不对p进行NULL判断可能会出现对NULL解引用访问的问题。
这种问题的解决办法就是:对malloc函数的返回值进行NULL判断
代码如下(示例):
int main()
{
int* p = malloc(40);
if (p == NULL)
{
perror("malloc");
return 1;
}
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
//对malloc开辟的空间进行使用....
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
free(p);
p = NULL;
return 0;
}
注意:最后不要忘了 free( p ) 和 p=NULL 哦!
二、对动态开辟空间的越界访问
如果在刚才的代码中加一个等号,如图,会发生什么现象呢?
在这里加上等号之后就会发生这种现象!
很明显,这里出现了越界访问的问题。
解决的办法:对内存边界要严格地检查!
三、对非动态开辟内存使用free释放
代码如下(示例):
int main()
{
int a = 10;
int* p = &a;
//...
free(p);
p = NULL;
return 0;
}
free只能释放动态内存开辟的空间,那么有很多人会问,a的空间怎么释放?这个问题很简单,首先a是一个局部变量,局部变量的生命周期是进入作用域创建,出了作用域就直接销毁了!但是malloc开辟的空间要用free来释放!
四、使用free释放一块动态开辟内存的一部分
代码如下(示例):
int main()
{
int* p = (int*)malloc(100);
if (p == NULL)
{
perror("malloc");
return 1;
}
//使用
int i = 0;
for (i = 0; i < 10; i++)
{
*p = i;
p++;
}
//释放空间
free(p);
p = NULL;
return 0;
}
这段代码相信很多人看来都是没有问题吧~
那么这段代码是如何出问题的呢?
五、对同一块动态内存多次释放
代码如下(示例):
int main()
{
int* p = (int*)malloc(100);
if (p == NULL)
{
perror("malloc");
return 1;
}
free(p);
//又写了一大段代码......
free(p);
p = NULL;
}
这样也出现很严重的后果,所以一定要尽量避免!!!
六、动态开辟内存忘记释放
代码如下(示例):>
void test()
{
int* p = (int*)malloc(100);
//忘记free释放
}
int main()
{
test();
while (1)
{
;
}
return 0;
}
调用完test函数之后p的地址也跟着一起销毁,并且malloc开辟的空间也没有被free释放掉,
这样就会产生内存泄漏的问题!
内存泄漏是很危险的事情,当内存被消耗干的时候,操作系统就无法完成正常的运转!
总结
例如:以上就是今天要讲的内容,本文仅仅简单介绍了动态内存管理的六个常见的错误以及各自的解决办法和如何避免这种错误,如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!