成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++函數(shù)返回指針和引用的坑

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

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

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

函數(shù)返回指針

在C++中針對一個函數(shù)返回指針的實現(xiàn)方式一般有三種:

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緊在函數(shù)funTest內(nèi)有效,當函數(shù)funTest結(jié)束了,變量a的生命周期也就結(jié)束了, 此時變量a所占用的內(nèi)存空間將被釋放,因此返回的指針地址將會被指向一個未知數(shù),后續(xù)再使用這個指針是未定義的行為,可能會導致程序崩潰或者出現(xiàn)其他異常。

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

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

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

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

我們修改一下funTest函數(shù)的變量a,使用static關(guān)鍵字修飾一下:

// 返回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;
}

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

3.使用動態(tài)分配內(nèi)存new關(guān)鍵字

int * funTest(){
    //動態(tài)分配的內(nèi)存空間,手動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如果忘記調(diào)用delete則會造成內(nèi)存泄露, 這就引發(fā)了一個指針變量誰維護銷毀的問題。一般默認規(guī)則是誰開發(fā)維護。

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

函數(shù)返回一個引用

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

int & funTest(){
    //動態(tài)分配的內(nèi)存空間,手動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上測試也是直接崩潰了,原因也是和上面所說的返回一個局部變量的地址一樣, 都是因為函數(shù)funTest結(jié)束后,變量a的生命周期結(jié)束了, 變量a也就是被釋放了,再返回它的引用的話就是未定義的。至于為什么它們的原因是一樣的呢?因為所謂引用,可以簡單地理解為引用其實就是帶const修飾的指針。

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

如何返回一個數(shù)組

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

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

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

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

正確的寫法應該是:

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

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

責任編輯:趙寧寧 來源: 思想覺悟
相關(guān)推薦

2011-07-13 16:14:53

C++引用指針

2010-01-18 15:53:27

C++析構(gòu)函數(shù)

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++編程開發(fā)

2010-01-11 15:29:13

引用C++語言

2025-05-20 08:10:00

函數(shù)函數(shù)類型函數(shù)指針類型

2024-02-22 14:06:39

C++指針開發(fā)

2011-07-15 01:20:58

C指針函數(shù)函數(shù)指針

2022-07-26 00:36:06

C#C++函數(shù)

2021-06-10 08:51:57

C++指針聲明指針相關(guān)概念

2011-04-11 11:09:50

this指針

2010-02-06 09:31:42

C++函數(shù)對象

2021-06-18 12:30:36

C++函數(shù)指針編程語言

2011-07-20 17:54:02

C++

2021-12-21 15:31:10

C++語言指針

2010-01-25 10:10:42

C++函數(shù)參數(shù)

2010-02-01 09:18:49

C++函數(shù)指針

2010-02-02 15:01:59

C++成員函數(shù)指針
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一区二区三区在线 | 毛片大全 | 美女黄网站视频免费 | 色婷婷av一区二区三区软件 | 国产日韩精品一区二区三区 | 精品一区二区三区在线视频 | 天天草天天干天天 | 中文字幕高清免费日韩视频在线 | 欧美一级免费看 | 久久精品亚洲欧美日韩久久 | 精品自拍视频 | 丝袜美腿一区二区三区 | 日韩图区| 国产乱精品一区二区三区 | 九九国产在线观看 | 欧美九九 | 日韩精品免费视频 | 欧美黄色一区 | 国产精品高潮呻吟久久久久 | 国产美女久久 | 久久四虎| 国产精品毛片久久久久久 | 国产精品久久久久婷婷二区次 | 亚洲国产中文字幕 | 久久男人| 精品中文在线 | 国产专区在线 | 欧美精品日韩精品 | 国产91在线播放 | 国产精品爱久久久久久久 | 成人在线免费观看视频 | 91麻豆精品国产91久久久更新资源速度超快 | 91精品综合久久久久久五月天 | 日本成人免费观看 | 中文字幕第90页 | 午夜免费视频 | 国产免费一区二区三区免费视频 | 欧美成人一级 | 久久日韩精品 | 天天色综 | 国产成人av在线播放 |