目录
我们在开辟动态内存和使用时要注意以下几点错误:
一、对空指针(NULL)的解引用操作
我们在上一期博客中特别提到这种情况,我们不管使用malloc、calloc、realloc任何管理动态内存函数时都有可能返回空指针(NULL)。我们在使用这些函数后一定要对其返回值进行判断,防止直接对空指针(NULL)的解引用操作。
拿malloc函数举例:
int main()
{
//申请
int* p = (int*)malloc(40);
//判断
if (p == NULL)//一定要对其返回值进行判断
{
perror("malloc");
return 1;
}
//使用
int i = 0;
for (i; i < 10; i++)
{
*(p + i) = i;
}
//释放
free(p);
p = NULL;
return 0;
}
如果我们不小心忽略了对其的判断,可能会直接造成程序崩溃:
二、对动态开辟空间的越界访问
当我们在用函数开辟动态之后我们要避免对其空间的越界访问(就是访问超过开辟的动态内存的空间的数据)。
我们还是用malloc函数来举例:
这此程序中使用malloc函数开辟了20个字节(也就是5个int类型大小的空间),但是在使用时程序是拿到开辟空间的地址向后访问10个字节的空间的,这就造成了越界访问,最后使程序崩溃 。所以我们在写代码的时候一定要考虑到越界访问的问题。
三、用free函数释放非动态内存空间
在我们写代码的时候有时可能会出现一个非常搞笑的问题,写糊涂了去用free函数释放非动态内存空间:
仅供参考,大家怎么可能犯这样的错误呢。
四、使用free函数释放所开辟动态空间的一部分
我们在使用free释放所开辟动态空间时,传入的指针一定要指向该空间的起始位置,不然会造成free函数无法造成释放空间:
五、用函数free对同一块动态空间多次释放
我们在编写代码时可能写着写着用函数free对同一块动态空间多次释放了,这也会造成程序运行出错:
但是我们在释放完一个空间时立即把传入的指针置为空就可以避开此错误:
所以我们还是写代码的时候要有一个清晰的思路,这样才能让自己少写bug。
六、动态开辟内存忘记释放(内存泄漏)
我们在写代码的时候很容易忘记释放我们不再使用的动态内存,虽然程序结束后会自动释放,但是这样并不利于程序的运行,会导致内存泄漏的问题。
在我们开辟并返回动态内存地址时就很容易忘记释放内存:
int* get_memory()
{
int* t = (int*)malloc(20);
if(t==NULL)
return NULL;
return t;
}
int main()
{
int* p = get_memory();
/*
.......
*/
return 0;
}
此段代码就忽略了动态内存的释放,我们在做类似的编程时也一定要注意不要忘记释放自己开辟的动态内存的空间(否则这种情况越多当程序运行时堆区的占用越多,最终会导致内存不足)。
今天的博客知识面较少,主要是一些错误代码的举例,以免我们写代码发生类似的错误。有则改之无则加勉,方能走的更远,在我们编程的道路上越码越远~
谢谢各位看官的支持,有错误或者可以改进的地方欢迎大家在评论区指出。本博主持续更新中,敬请期待!