国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C++函數返回指針和引用的坑

開發 前端
今天這篇文章我們來看看在C++新手們針對指針和引用的使用經常犯的錯誤。

常用C++進行項目開發的童鞋們應該都知道,在C++中指針和引用是常用的語法了,而指針又是C++區別于其他高級語言的一大精髓。

而今天我們再來看看在C++新手們針對指針和引用的使用經常犯的錯誤。

函數返回指針

在C++中針對一個函數返回指針的實現方式一般有三種:

1.返回一個變量的地址

例如以下代碼:

// 返回int指針地址
int * funTest(){
    int a = 101;
    return &a;
}

int main(int argc, const char *argv[]) {
    int *a = funTest();
    std::cout << "a的值:" << *a << std::endl;
    return 0;
}

以上代碼在筆者的電腦上運行就直接報錯崩潰了,崩潰信息:

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

上面的代碼返回一個局部變量a的地址,這個變量a緊在函數funTest內有效,當函數funTest結束了,變量a的生命周期也就結束了, 此時變量a所占用的內存空間將被釋放,因此返回的指針地址將會被指向一個未知數,后續再使用這個指針是未定義的行為,可能會導致程序崩潰或者出現其他異常。

針對這樣的危險代碼行為,其實編輯器也已經給出了警告,所以說在開發過程中也不要以為的忽略警告哦。

為了杜絕此類行為的發生,還可以使用筆者之前的介紹的代碼質量檢測工具cppcheck進行檢測,在開發過程中直接劃線提醒。

介紹一款CPP代碼bug檢測神器。

2.返回一個使用static修飾的變量地址

我們修改一下funTest函數的變量a,使用static關鍵字修飾一下:

// 返回int指針地址
int * funTest(){
    static int a = 101;
    return &a;
}

int main(int argc, const char *argv[]) {
    int *a = funTest();
    std::cout << "a的值:" << *a << std::endl;
    return 0;
}

運行發現程序并沒有崩潰,而且是正確打印出了變量a的值。這是因為 使用static 表示將這個變量存儲到全局區(static靜態區), 此時就不受棧區管控,當函數funTest執行完畢后,變量a依然存在,不會存在前面所說的變量地址被釋放的問題。

3.使用動態分配內存new關鍵字

int * funTest(){
    //動態分配的內存空間,手動delete后才會釋放
    int* a = new int(101) ;
    return a;
}

int main(int argc, const char *argv[]) {
    int *a = funTest();
    std::cout << "a的值:" << *a << std::endl;
    return 0;
}

上述代碼不會崩潰,也能正常運行,但是存在一個隱患就是返回的指針變量a如果忘記調用delete則會造成內存泄露, 這就引發了一個指針變量誰維護銷毀的問題。一般默認規則是誰開發維護。

因此,針對這樣的場景,筆者的建議是智能指針你值得擁有...

函數返回一個引用

我們看看以下返回一個引用的例子代碼:

int & funTest(){
    //動態分配的內存空間,手動delete后才會釋放
    int a = 101 ;
    return a;
}

int main(int argc, const char *argv[]) {
    int a = funTest();
    std::cout << "a的值:" << a << std::endl;
    return 0;
}

筆者在CLion上測試也是直接崩潰了,原因也是和上面所說的返回一個局部變量的地址一樣, 都是因為函數funTest結束后,變量a的生命周期結束了, 變量a也就是被釋放了,再返回它的引用的話就是未定義的。至于為什么它們的原因是一樣的呢?因為所謂引用,可以簡單地理解為引用其實就是帶const修飾的指針。

那么針對這個問題該如何修正呢?首先使用static關鍵字肯定是可以的。那么使用動態內存new的方式行不行呢?答案也是可行的,但是需要注意的一點就是如果一個引用 的值來源于一個指針,后來這個指針被delete掉了,那么再使用這個引用也是會造成崩潰的...

如何返回一個數組

那么問題來了,舉一反三,如果想通過一個函數返回一個數組那該如何實現呢?

眾所周知,C++是不允許直接返回一個數組的,如果您想要從函數返回一個一維數組,您必須聲明一個返回指針的函數。

例如下面的寫法是編譯不通過的:

// 無法編譯通過,不能返回一個數組
int[] funTest(){
    int myArray[3] = {1, 2, 3};
    return myArray;
}

正確的寫法應該是:

int* funTest(){
    static int myArray[3] = {1, 2, 3};
    return myArray;
}

因而可以看出,其實返回一個數組的函數所遇到的坑其實就轉換成了返回一個指針的函數所遇到的坑,這些坑的舉例就如前面所說...

責任編輯:趙寧寧 來源: 思想覺悟
相關推薦

2011-07-13 16:14:53

C++引用指針

2010-01-18 15:53:27

C++析構函數

2014-01-24 09:49:01

C++指針

2015-05-13 10:37:58

C++指針與引用

2021-07-28 06:53:02

C++Const指針傳遞

2024-05-15 16:01:04

C++編程開發

2010-01-11 15:29:13

引用C++語言

2024-02-22 14:06:39

C++指針開發

2025-05-20 08:10:00

函數函數類型函數指針類型

2011-07-15 01:20:58

C指針函數函數指針

2022-07-26 00:36:06

C#C++函數

2021-06-10 08:51:57

C++指針聲明指針相關概念

2011-04-11 11:09:50

this指針

2021-06-18 12:30:36

C++函數指針編程語言

2010-02-06 09:31:42

C++函數對象

2010-01-25 10:10:42

C++函數參數

2011-07-20 17:54:02

C++

2021-12-21 15:31:10

C++語言指針

2010-02-01 09:18:49

C++函數指針

2010-02-02 15:01:59

C++成員函數指針
點贊
收藏

51CTO技術棧公眾號

91久久精品国产| 日本福利一区| 成人激情诱惑| 欧美一级久久久久久久大片| 黄色一级片网址| 国产极品久久久久久久久波多结野| 韩国理伦片一区二区三区在线播放 | 亚洲精品一区二区在线| 可播放的18gay1069| 国产精品99久久久久久宅男| 99se婷婷在线视频观看| 午夜精品福利影院| 久久天天躁日日躁| 天堂电影一区| 欧美一区二区三区日韩视频| 首播影院在线观看免费观看电视| 久久综合色之久久综合| 992tv成人免费观看| 久久久成人网| 国产成人精品日本亚洲11| 精品久久电影| 欧美怡红院视频一区二区三区| 日本精品久久| 精品调教chinesegay| 日皮视频在线观看| 欧美日韩久久久久久| 同心难改在线观看| 亚洲精品成人少妇| 三级黄色的网站| 中文字幕在线观看一区| 奇米影音第四色| 国产丝袜欧美中文另类| 日韩av在线综合| 91看片淫黄大片一级在线观看| 青青在线视频免费观看| 国产麻豆成人传媒免费观看| 四虎永久免费网站| 国产剧情一区二区| 国产日产欧美一区二区| 国产美女av一区二区三区| 欧美日韩中文字幕在线播放| 国产不卡视频在线观看| 欧美亚洲日本一区二区三区 | 国产一区二区中文| 亚洲japanese制服美女| 亚洲激情中文| 精品不卡在线| 视频一区二区不卡| 免费久久久久久| www.66久久| 成人影院在线观看视频| 夜夜精品浪潮av一区二区三区| 在线免费毛片| 欧美高清性hdvideosex| 99热国产在线| 亚洲美女av在线| 韩国三级成人在线| 国产精品成人免费电影| 欧美另类视频| 亚洲不卡一卡2卡三卡4卡5卡精品| 精品一区二区三区蜜桃| 欧美日韩在线一| 亚洲精品国产成人久久av盗摄| 午夜在线网站| 亚洲国产精品久久久久久| 99er精品视频| 国产精品露脸自拍| 久久aⅴ国产紧身牛仔裤| 日韩精品在线观看av| 国产女人aaa级久久久级 | 超碰在线12| 欧美天堂一区二区三区| 182tv在线播放| 久久韩国免费视频| 日韩成人影院| 在线精品亚洲一区二区| 国产精品欧美经典| 日本电影在线观看| 日韩三级电影网址| 亚洲人成网站精品片在线观看| 男人天堂亚洲| 亚洲精品欧美极品| 欧美不卡在线观看| 涩涩日韩在线| 久久精品美女视频网站| 久久久久久久久成人| 五月天婷婷激情视频| 欧美激情极品视频| 欧美xxxx14xxxxx性爽| 9久草视频在线视频精品| 国产精品久久久久一区二区三区厕所| 肉色欧美久久久久久久免费看| 3d蒂法精品啪啪一区二区免费| 欧美高清视频www夜色资源网| 国产一区二区三区日韩 | 日韩国产在线一| 国产精品国产自产拍高清av| 免费日韩视频| 日韩在线伦理| 成人中文字幕在线播放| 5g国产欧美日韩视频| 欧美一区二区在线观看| 亚洲第一福利一区| 亚洲视频一区二区免费在线观看| 91精品国产成人观看| 在线视频专区| 国产精品久久久久久亚洲调教 | 国产写真视频在线观看| 国产欧美日韩伦理| 亚洲欧美中文另类| 欧美三级视频在线| 依依成人综合视频| av一本久道久久综合久久鬼色| 先锋影音久久| 狠狠色丁香婷婷综合| 欧美人与性动交xxⅹxx| 韩国黄色一级大片| 国产成人av一区二区三区| 国内精品视频一区| 欧美大片在线观看一区| 欧美一区二区成人6969| 国产在线一区二区| 久久最新网址| 国精一区二区三区| 亚洲国产成人精品无码区99| 国产精品久久久久久久久久三级 | 97精品一区二区三区| 另类一区二区| 亚州av中文字幕在线免费观看| 亚洲国产精品www| 久久久爽爽爽美女图片| 国产精品mp4| 国产精品对白刺激久久久| 欧美怡春院一区二区三区| 欧美三级韩国三级日本一级| 黄色成人在线网址| 狠狠久久亚洲欧美| 国产sm精品调教视频网站| 国产国产精品| 国产在线xxx| 免费日韩中文字幕| 久久在线中文字幕| 国产精品久久精品国产| 国产成人一区三区| 国产成人精品一区二区三区| 亚洲嫩模很污视频| 欧美猛男男办公室激情| 国产一区二区黄| 欧美激情a在线| 国产视频久久久久| 日本不卡视频一二三区| 任你弄精品视频免费观看| av资源一区| 国产伦精品免费视频| 日韩电影中文字幕av| ●精品国产综合乱码久久久久| 天堂一区二区在线免费观看| 高潮毛片在线观看| 中文字幕一区二区三区精彩视频| 这里只有精品视频| 欧美日韩加勒比精品一区| 欧美国产一区二区| 色欧美自拍视频| 青青操视频在线| www成人免费| 日日橹狠狠爱欧美超碰| 欧美另类在线观看| 久久久久久久久久久久久久| 成视频在线免费观看| 成人av在线网址| 欧美天天综合网| 麻豆国产欧美日韩综合精品二区 | 亚洲精品欧美一区二区三区| 亚洲成a人v欧美综合天堂下载| 精品久久美女| 青青草超碰在线| 婷婷久久伊人| 日韩在线视频播放| 欧美国产激情二区三区| 神马电影久久| 成年人视频在线观看免费| 亚洲春色在线| 久久影视免费观看| 一区二区三区不卡在线观看 | 国产伦精品一区二区三区高清版 | 亚洲精品久久久久久一区二区| 日韩成人中文字幕在线观看| 精东粉嫩av免费一区二区三区| 91精品影视| 成人毛片高清视频观看| 91精品久久久久久久久| 欧美少妇一区二区| 精品一区二区免费| 窝窝社区一区二区| 视频午夜在线| 欧美日韩午夜爽爽| 热久久99这里有精品| 欧美美女直播网站| 99久久精品国产一区二区三区| 激情五月色综合国产精品|