C語言動態(tài)內存泄露常見問題內存分配改進方法詳解
一、例題
試問該段代碼能打印什么,或者不能打印什么,說出理由
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void getmemory(char*p)
{
p = (char*)malloc(100);
}
void test()
{
char*str = NULL;
getmemory(str);
strcpy(str, "hello world");
printf("%s",str);
}
int main()
{
test();
return 0;
}
這段代碼乍一看好像沒有啥問題,test函數(shù)進去創(chuàng)建一個str嘛,然后str傳給getmemory函數(shù),開辟一塊空間,然后hello world這字符串放進開辟的空間里,然后打印str也就是hello world嘛。
但是,上面的思路是完全錯誤的,代碼完全無法運行,解釋如下:
- 第一:你str傳到getmemory函數(shù)里,p開辟一個空間,被開辟的空間和str沒有關系
(傳值調用和傳址調用的區(qū)別)
- 第二:你getmemory函數(shù)出來之后,開辟的空間沒有釋放掉,而且你p由于函數(shù)的結束已經銷毀了,p銷毀之后再也無法找到開辟的空間,造成內存泄漏
就比如p是一個警察頭子,開辟的空間是臥底,只有p知道那個臥底,你現(xiàn)在警察頭子死了,再也沒法證明臥底是臥底了
也就是說p消失后,沒辦法再對開辟的空間進行釋放,這時就會造成內存泄露
二、2種改進方法
法1:二級指針(傳址調用)
代碼如下(示例):
void getmemory(char**p)
{
*p = (char*)malloc(100);//p是str地址,*p是str
}
void test()
{
char*str = NULL;
getmemory(&str);
strcpy(str, "hello world");
printf("%s",str);
free(str);
str = NULL;
}
int main()
{
test();
return 0;
}
因為之前的傳值調用沒法讓p和str建立聯(lián)系,那我們就傳地址,開辟一塊空間出來賦給*p
要注意的是,p是str地址嘛,*p也就是str,到這里,str掌握了新開辟空間的控制權。然后getmemory函數(shù)出來,進行strcpy和printf操作,最后不要忘記free掉原先的空間。
法2:返回指針
代碼如下(示例):
char* getmemory(char*p)
{
p = (char*)malloc(100);
return p;
}
void test()
{
char*str = NULL;
str=getmemory(str);
strcpy(str, "hello world");
printf("%s", str);
free(str);
str = NULL;
}
int main()
{
test();
return 0;
}
因為這里是開辟了一塊空間給指針p管理嘛,str和p沒有建立聯(lián)系,那你直接函數(shù)返回p這個指針然后賦值給str即可,隨后操作和方法1一樣
總結
本文介紹了動態(tài)內存分配的常見例題及兩種改進方法,讀者需要理解為何會發(fā)生內存泄露和傳值與傳址調用的區(qū)別就可以熟練解決這類問題。以上,祝讀者學習愉快~希望大家以后多多支持腳本之家!
相關文章
C/C++?Qt?TableDelegate?自定義代理組件使用詳解
TableDelegate自定義代理組件的主要作用是對原有表格進行調整,本文主要介紹了QT中TableDelegate?自定義代理組件的使用教程,感興趣的朋友可以了解一下2021-12-12
C++中overload,override,overwrite的區(qū)別詳細解析
以下是對C++中overload,override,overwrite的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下2013-09-09
仿現(xiàn)代C++智能指針實現(xiàn)引用計數(shù)
這篇文章主要為大家詳細介紹了如何仿現(xiàn)代C++智能指針實現(xiàn)引用計數(shù),文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以了解下2024-03-03
C語言數(shù)組按協(xié)議存儲與按協(xié)議解析數(shù)據(jù)的實現(xiàn)
今天小編就為大家分享一篇關于C語言數(shù)組按協(xié)議存儲與按協(xié)議解析數(shù)據(jù)的實現(xiàn),小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
C++的template模板中class與typename關鍵字的區(qū)別分析
這篇文章中我們來談一談C++的template模板中class與typename關鍵字的區(qū)別分析,同時會講到嵌套從屬名稱時的一些注意點,需要的朋友可以參考下2016-06-06

