最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言動(dòng)態(tài)內(nèi)存泄露常見(jiàn)問(wèn)題內(nèi)存分配改進(jìn)方法詳解

 更新時(shí)間:2021年10月22日 10:09:01   作者:高郵吳少  
今天遇見(jiàn)了一道有意思的內(nèi)存泄露題目,特地分享給大家,相信屏幕前的你學(xué)習(xí)完一定有所收獲,預(yù)祝讀者學(xué)習(xí)愉快,多多進(jìn)步早日升職加薪

一、例題

試問(wèn)該段代碼能打印什么,或者不能打印什么,說(shuō)出理由

#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;
}

這段代碼乍一看好像沒(méi)有啥問(wèn)題,test函數(shù)進(jìn)去創(chuàng)建一個(gè)str嘛,然后str傳給getmemory函數(shù),開(kāi)辟一塊空間,然后hello world這字符串放進(jìn)開(kāi)辟的空間里,然后打印str也就是hello world嘛。
但是,上面的思路是完全錯(cuò)誤的,代碼完全無(wú)法運(yùn)行,解釋如下:

  • 第一:你str傳到getmemory函數(shù)里,p開(kāi)辟一個(gè)空間,被開(kāi)辟的空間和str沒(méi)有關(guān)系
    (傳值調(diào)用和傳址調(diào)用的區(qū)別)
  • 第二:你getmemory函數(shù)出來(lái)之后,開(kāi)辟的空間沒(méi)有釋放掉,而且你p由于函數(shù)的結(jié)束已經(jīng)銷毀了,p銷毀之后再也無(wú)法找到開(kāi)辟的空間,造成內(nèi)存泄漏

就比如p是一個(gè)警察頭子,開(kāi)辟的空間是臥底,只有p知道那個(gè)臥底,你現(xiàn)在警察頭子死了,再也沒(méi)法證明臥底是臥底了
也就是說(shuō)p消失后,沒(méi)辦法再對(duì)開(kāi)辟的空間進(jìn)行釋放,這時(shí)就會(huì)造成內(nèi)存泄露

二、2種改進(jìn)方法

法1:二級(jí)指針(傳址調(diào)用)

代碼如下(示例):

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;
}

因?yàn)橹暗膫髦嫡{(diào)用沒(méi)法讓p和str建立聯(lián)系,那我們就傳地址,開(kāi)辟一塊空間出來(lái)賦給*p
要注意的是,p是str地址嘛,*p也就是str,到這里,str掌握了新開(kāi)辟空間的控制權(quán)。然后getmemory函數(shù)出來(lái),進(jìn)行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;
}

因?yàn)檫@里是開(kāi)辟了一塊空間給指針p管理嘛,str和p沒(méi)有建立聯(lián)系,那你直接函數(shù)返回p這個(gè)指針然后賦值給str即可,隨后操作和方法1一樣

總結(jié)

本文介紹了動(dòng)態(tài)內(nèi)存分配的常見(jiàn)例題及兩種改進(jìn)方法,讀者需要理解為何會(huì)發(fā)生內(nèi)存泄露和傳值與傳址調(diào)用的區(qū)別就可以熟練解決這類問(wèn)題。以上,祝讀者學(xué)習(xí)愉快~希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++面試八股文之了解auto關(guān)鍵字

    C++面試八股文之了解auto關(guān)鍵字

    這篇文章主要為大家介紹了C++面試八股文之了解auto關(guān)鍵字問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • C語(yǔ)言中隨機(jī)數(shù)rand()函數(shù)詳解

    C語(yǔ)言中隨機(jī)數(shù)rand()函數(shù)詳解

    大家好,本篇文章主要講的是C語(yǔ)言中隨機(jī)數(shù)rand()函數(shù)詳解,感興趣的同學(xué)感快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • C++?中IO流詳解

    C++?中IO流詳解

    這篇文章主要介紹了C++?IO流的相關(guān)知識(shí)點(diǎn),文中有詳細(xì)的代碼,希望可以幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2023-05-05
  • 基于C語(yǔ)言實(shí)現(xiàn)掃雷小游戲

    基于C語(yǔ)言實(shí)現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++實(shí)操之內(nèi)聯(lián)成員函數(shù)介紹

    C++實(shí)操之內(nèi)聯(lián)成員函數(shù)介紹

    大家好,本篇文章主要講的是C++實(shí)操之內(nèi)聯(lián)成員函數(shù)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語(yǔ)言選擇排序算法及實(shí)例代碼

    C語(yǔ)言選擇排序算法及實(shí)例代碼

    本篇文章主要介紹了 C語(yǔ)言選擇排序算法,這里提供代碼實(shí)例以便大家理解,通過(guò)本文,更好的理解排序算法
    2016-07-07
  • C++實(shí)現(xiàn)并優(yōu)化異常系統(tǒng)

    C++實(shí)現(xiàn)并優(yōu)化異常系統(tǒng)

    異常處理是C++的一項(xiàng)語(yǔ)言機(jī)制,用于在程序中處理異常事件,下面這篇文章主要給大家介紹了關(guān)于C++中異常的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • C++簡(jiǎn)單實(shí)現(xiàn)shared_ptr的代碼

    C++簡(jiǎn)單實(shí)現(xiàn)shared_ptr的代碼

    智能指針用于資源管理,為了保證資源的操作得到順利的執(zhí)行防止資源泄露,因此大多數(shù)實(shí)現(xiàn)都以noexcept在參數(shù)列表后聲明為不拋出異常,這篇文章主要介紹了C++簡(jiǎn)單實(shí)現(xiàn)shared_ptr的代碼,需要的朋友可以參考下
    2022-09-09
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單停車場(chǎng)管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單停車場(chǎng)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單停車場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • c++如何使用openssl接口來(lái)生成隨機(jī)數(shù)

    c++如何使用openssl接口來(lái)生成隨機(jī)數(shù)

    OpenSSL是一個(gè)強(qiáng)大的加密庫(kù),不僅支持加密解密,還能生成隨機(jī)數(shù),設(shè)置過(guò)程包括下載資源文件、配置項(xiàng)目及修改屬性頁(yè)等步驟,確保庫(kù)文件正確包含,在Visual Studio中正確配置后,可使用RAND_bytes函數(shù)生成隨機(jī)數(shù),此過(guò)程需要注意文件路徑和附加目錄的設(shè)置
    2024-10-10

最新評(píng)論

确山县| 张家界市| 集贤县| 巴里| 栖霞市| 龙川县| 深州市| 喜德县| 益阳市| 利川市| 榆社县| 平乐县| 南陵县| 庐江县| 民丰县| 共和县| 远安县| 南安市| 桑日县| 青浦区| 德江县| 克东县| 吴堡县| 榆社县| 抚州市| 九龙县| 德庆县| 福建省| 鄂尔多斯市| 巴塘县| 萨嘎县| 阜城县| 惠水县| 东平县| 霞浦县| 晋州市| 博客| 砀山县| 宁城县| 临漳县| 望江县|