国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C/C++ - 總結(jié)了24個C++的大坑,你能躲過幾個

總結(jié)了24個C++的大坑,你能躲過幾個

2021-11-04 13:35程序喵大人 C/C++

這篇文章主要介紹了總結(jié)了24個C++的大坑,你能躲過幾個,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前段時間給部門做了個C++專題的分享,主要分享了C++語言里一些常見的坑,在這里也分享給大家。

以下是本文目錄:

總結(jié)了24個C++的大坑,你能躲過幾個

首先說下C++和C語言有什么區(qū)別?分享一個我在知乎上看見的回答:

  • C++ ≈ C with classes, C with STL
  • C:面向機器編程
  • C++:面向編譯器編程

C++有個很重要的特性叫RAII,個人認(rèn)為可以多多使用,相當(dāng)方便,關(guān)于RAII巧妙使用可以看我這兩篇文章《RAII妙用之ScopeExit》《RAII妙用之計算函數(shù)耗時》。

言歸正傳,下面我一個一個的列出來C++使用過程中常見的坑:

無符號整數(shù)的錯誤使用

?
1
for (unsigned int i = 10; i >= 0; --i) { ... }

上面這段代碼會發(fā)生什么? 會死循環(huán),這里要注意下無符號整數(shù)的使用。

容器的size()返回類型是無符號整數(shù)

?
1
2
3
4
5
std::vector<int> vec;
vec.push_back(1);
for (auto idx = vec.size(); idx >= 0; idx--) {
    cout << "===== \n";
}

這段代碼依舊會出現(xiàn)死循環(huán),原因參考上一條。

memcpy、memset只適用于POD結(jié)構(gòu)

至于什么是POD類型,其實解釋起來挺麻煩的,感興趣的可以直接看cppreference的https://en.cppreference.com/w/cpp/named_req/PODType

STL遍歷刪除時注意迭代器失效問題

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void erase(std::vector<int> &vec, int a) {
    for (auto iter = vec.begin(); iter != vec.end();) { // 這個正確
        if (*iter == a) {
            iter = vec.erase(iter);
        } else {
            ++iter;
        }
    }
 
    for (auto iter = vec.begin(); iter != vec.end(); ++iter) {  // error
        if (*iter == a) {
            vec.erase(iter); // error
        }
    }
}

std::list排序使用自己的成員方法

一般的容器排序都使用std::sort(),但是list特殊。

?
1
2
3
4
5
6
7
8
9
10
int main() {
    std::list<int> list{1, 2, 3, 2};
    list.sort();
    // std::sort(list.begin(), list.end());
    for (auto i : list) {
        std::cout << i << " ";
    }
    std::cout << "\n";
    return 0;
}

new/delete、new[]/delete[]、malloc/free嚴(yán)格配對

這幾個一定要配對使用,原因的話可以看我之前的文章《new[]和delete[]為何要配對使用?

基類析構(gòu)函數(shù)要是虛函數(shù)

如果不是虛函數(shù)的話,可能會有內(nèi)存泄漏的問題

注釋用/**/,而不是//

注釋用/**/,可能會出問題。原因:utf-8和ANSC(GB2312)編碼混亂后,中文注釋就亂碼了,亂碼中藏著 */,匹配錯了,導(dǎo)致IDE實際注釋的部分并非肉眼所見,定位極其困難,常見于Windows中。

成員變量初始化

成員變量沒有默認(rèn)初始化行為,需要手動初始化。

不要返回局部變量的指針或引用

?
1
2
3
4
char* func() {
    char a[3] = {'a', 'b', 'c'};
    return a;
}

棧內(nèi)存容易被污染。

浮點數(shù)判斷是否相等問題

?
1
2
3
float f;
if (f == 0.2) {} // 錯誤用法
if (abs(f - 0.2) < 0.00001) {} // 正確用法

vector clear和swap問題

清空某個vector,可以使用swap而不是其clear方法,這樣可以更早的釋放vector內(nèi)部內(nèi)存。

?
1
2
3
vector<int> vec;
vector<int>().swap(vec);
vec.clear();

vector問題

盡量不要在vector中存放bool類型,vector為了做優(yōu)化,它的內(nèi)部存放的其實不是bool。

條件變量

條件變量的使用有兩大問題:信號丟失和虛假喚醒,相當(dāng)重要,具體可以看我這篇文章《使用條件變量的坑你知道嗎》。

類型轉(zhuǎn)換

在C++中盡量使用C++風(fēng)格的四種類型轉(zhuǎn)換,而不要使用C語言風(fēng)格的強制類型轉(zhuǎn)換。

異步操作中async的使用

?
1
2
std::async(std::launch::async, []{ f(); }); // 臨時量的析構(gòu)函數(shù)等待 f()
std::async(std::launch::async, []{ g(); }); // f() 完成前不開始

std::async 這貨返回的 future 和通過 promise 獲取的 future 行為不同,async 返回的 future 對象在析構(gòu)時會阻塞等待 async 中的線程執(zhí)行完畢,這就導(dǎo)致在大部分場景中 async達不到你直覺的認(rèn)為它能達到的目的。

智能指針

一個裸指針不要使用多個智能指針包裹,盡可能使用make_unique,make_shared。

當(dāng)需要在類得內(nèi)部接口中,需要將this作為智能指針使用,需要用該類派生自enable_shared_from_this

棧內(nèi)存使用

合理使用棧內(nèi)存,特別是數(shù)組,數(shù)組越界問題容易導(dǎo)致棧空間損壞,可以考慮使用std::array替代普通的數(shù)組。

std::thread的使用

一定要記得join或這detach,否則會crash。

?
1
2
3
4
5
6
7
8
void func() {}
int main() {
    std::thread t(func);
    if (t.joinable()) {
        t.join(); // 或者t.detach();
    }
    return 0;
}

enum使用

盡量使用enum class替代enum,enum class 是帶有作用域的枚舉類型。

空指針使用nullptr而不是NULL

至于為什么要這么使用,可以看我這篇文章《關(guān)于nullptr這篇文章你一定要看

?
1
2
3
4
5
6
7
8
9
10
11
12
void func(char*) {
    cout << "char*";
}
void func(int) {
    cout << "int";
}
 
int main() {
     func(NULL); // 編譯失敗 error: call of overloaded ‘func(NULL)' is ambiguous
    func(nullptr); // char*
    return 0;
}

std::remove的使用

這個remove其實并沒有真正的刪除元素,需要和erase配合使用,跑一下這段代碼就知道啦。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
bool isOdd(int i) { return i & 1; }
 
void print(const std::vector<int>& vec) {
    for (const auto& i : vec) {
        std::cout << i << ' ';
    }
    std::cout << std::endl;
}
 
int main() {
    std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    print(v);
 
    std::remove(v.begin(), v.end(), 5);  // error
    print(v);
 
    v.erase(std::remove(v.begin(), v.end(), 5), v.end());
    print(v);
 
    v.erase(std::remove_if(v.begin(), v.end(), isOdd), v.end());
    print(v);
}

全局變量初始化問題

不同文件中的全局變量初始化順序不固定,全局變量盡量不要互相依賴,否則由于初始化順序不固定的問題,可能會導(dǎo)致bug產(chǎn)生。

到此這篇關(guān)于總結(jié)了24個C++的大坑,你能躲過幾個的文章就介紹到這了,更多相關(guān)C++ 坑內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://mp.weixin.qq.com/s/7PolqHz6IH1wuZTXKPU_xg

  • C++
  • 延伸 · 閱讀

    精彩推薦
    • C/C++學(xué)習(xí)C++編程的必備軟件

      學(xué)習(xí)C++編程的必備軟件

      本文給大家分享的是作者在學(xué)習(xí)使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

      謝恩銘10102021-05-08
    • C/C++深入理解goto語句的替代實現(xiàn)方式分析

      深入理解goto語句的替代實現(xiàn)方式分析

      本篇文章是對goto語句的替代實現(xiàn)方式進行了詳細(xì)的分析介紹,需要的朋友參考下...

      C語言教程網(wǎng)7342020-12-03
    • C/C++C語言實現(xiàn)電腦關(guān)機程序

      C語言實現(xiàn)電腦關(guān)機程序

      這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)電腦關(guān)機程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下...

      xiaocaidayong8482021-08-20
    • C/C++詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

      詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

      strcpy 和strcnpy函數(shù)是字符串復(fù)制函數(shù)。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數(shù)使用,感興趣的朋友跟隨小編要求看看吧...

      spring-go5642021-07-02
    • C/C++c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

      c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

      這篇文章主要介紹了c++ 單線程實現(xiàn)同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下...

      源之緣11542021-10-27
    • C/C++C/C++經(jīng)典實例之模擬計算器示例代碼

      C/C++經(jīng)典實例之模擬計算器示例代碼

      最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關(guān)于C/C++經(jīng)典實例之模擬計算器的相關(guān)資料,文中通過示...

      jia150610152021-06-07
    • C/C++C語言中炫酷的文件操作實例詳解

      C語言中炫酷的文件操作實例詳解

      內(nèi)存中的數(shù)據(jù)都是暫時的,當(dāng)程序結(jié)束時,它們都將丟失,為了永久性的保存大量的數(shù)據(jù),C語言提供了對文件的操作,這篇文章主要給大家介紹了關(guān)于C語言中文件...

      針眼_6702022-01-24
    • C/C++C++之重載 重定義與重寫用法詳解

      C++之重載 重定義與重寫用法詳解

      這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下...

      青山的青6062022-01-04
    Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
    主站蜘蛛池模板: 欧美一区二区在线刺激视频 | 精品在线一区二区三区 | 日韩有码在线视频 | 亚洲理论电影在线观看 | 黄视频免费观看网站 | 亚洲免费网站 | 亚洲 欧美 另类 综合 偷拍 | 国产成人久久 | 黄色99| 亚洲天堂网站 | 在线中文字幕第一页 | 黄色电影免费在线观看 | 一区国产精品 | 欧美日韩一区二区视频在线观看 | 日日摸夜夜 | 91精品国产高清一区二区三区 | 九色一区 | 久久精品一区二区三区四区 | www.久久久| 91成人小视频 | 国产精品福利午夜在线观看 | 永久黄网站色视频免费观看w | 欧美狠狠 | 成人午夜在线 | 国产 欧美 日韩 一区 | 日韩视频在线免费播放 | 欧美狠狠操 | 日韩成人免费av | 日韩在线观看中文字幕 | 真实国产露脸乱 | 天天干夜夜弄 | 免费看的av| 中文字幕亚洲一区二区三区 | 久久中文字幕在线 | 国产精品第一国产精品 | 91精品秘密在线观看 | 亚洲国产精品99久久久久久久久 | 99久久综合精品五月天 | 国产一区二区三区在线免费看 | 精品日韩一区二区 | 欧美日韩精品一区 |