一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - C/C++ - C++未定義行為(undefined behavior)

C++未定義行為(undefined behavior)

2021-04-30 15:24木子兮 C/C++

對于未定義行為,C++標準沒有明確規定編譯器們應該怎么做,那么執行的結果就是不可預料的。下面我們來詳細探討下

衡量一個人是否真正活著的根本方法,就是看他是否有意愿、有能力做出主動的選擇。

在計算機程序設計中,未定義行為(undefined behavior)是指行為不可預測的計算機代碼。這是一些編程語言的一個特點,最有名的是在C語言中。在這些語言中,為了簡化標準,并給予實現一定的靈活性,標準特別地規定某些操作的結果是未定義的,這意味著程序員不能預測會發生什么事。

一個問題

此問題摘自知乎:

對順序容器 ( vector ) 的訪問:

如果使用 operator[] 訪問容器,下標越界是未定義行為。
使用 at 訪問,下標越界,則拋出一個 out_of_range 異常。
下標越界應該是明顯錯誤的,但是為什么 C++ 標準選擇把 operator[] 列為未定義行為,而加入at成員在對成員訪問時進行下標檢查?

同樣摘取一些回答

回答一:

C++ 的設計理念之一,就是你不需要為你不使用的特性付出代價。如果你能確保你的下標不越界,C++就不會進行檢查。

回答二:

檢查就表示有運算判斷的開銷,C++將效率放在第一位,假設用戶之前已經對[]訪問的下標做過檢查了,在一個大量訪問的for循環中,但是vector還是自作聰明的每次都判斷一次下標越界,這個效率影響你可想而知!你會不會在這個情況下罵它管的太多呢。所以說將所有的權利都交給你,vector不做太多自作聰明的處理。

什么是未定義

未定義行為(Undefined Behavior)是指語言標準未做規定的行為。同時,標準也從沒要求編譯器判斷未定義行為,所以這些行為有編譯器自行處理,在不同的編譯器可能會產生不同的結果,又或者如果程序調用未定義的行為,可能會成功編譯,甚至一開始運行時沒有錯誤,只會在另一個系統上,甚至是在另一個日期運行失敗。當一個未定義行為的實例發生時,正如語言標準所說,“什么事情都可能發生”,也許什么都沒有發生。

下文會羅列C++中的一系列未定義結果和未定義行為,持續整理更新。

未定義的結果

1、當我們賦給帶符號類型一個超出它表示范圍的值時,結果是未定義的。

signed char c2 = 256; // c2的值是未定義的

2、函數體之內定義的變量:未初始化(uninitialized),其值undefined。

3、算術表達式有可能產生未定義的結果

數學性質本身:除數為0
計算機的特點:溢出;很多系統在編譯和運行時都不報出溢出錯誤,像其他未定義的行為一樣,溢出的結果是不可預知的。

未定義的行為

未定義行為,無法預估Runtime會發生什么(unpredictable:normal、crashing、incorrect results)。

1、解引用空指針、非法迭代器或者尾后迭代器都是未定義行為

2、訪問一個無效數組索引,下標越界

3、當derived class對象經由一個base class指針被刪除,而該base class帶著一個non-virtual析構函數,其結果是未定義的。

實際執行時通常發生的是對象的derived成員沒有被銷毀。
4、在兩個異常同時存在的情況下,程序若不是結束執行就是導致未定義行為。

5、釋放一個非new分配的內存,或者將相同的指針值釋放多次,其行為是未定義的。

6、string s(s2,pos2); // s是string s2從下標pos2開始的字符拷貝,如果pos2>s2.size(),構造函數的行為未定義

7、試圖比較兩個無關地址是未定義行為

8、對于那些沒有指定執行順序的運算符來說,如果表達式指向并修改了同一個對象,將會引發錯誤并產生未定義的行為。

?
1
2
3
4
int i=0;
cout<<i<<" "<<++i<<endl; // 未定義
// 編譯器可能先求++i的值,再求i的值;也可能先求i的值,再求++i的值。注意與print函數的區別。
*beg=toupper(*beg++); // 未定義

9、對有符號數進行左移操作可能會改變符號位的值,因此是一種未定義的行為。移位運算符右側的運算對象一定不能為負,而且值必須嚴格小于結果的位數,否則就會產生未定義的行為。

10、使用static_cast將void*轉換成其他類型指針,必須確保轉換后所得的類型就是指針所指的類型。類型一旦不符,將產生未定義行為。

?
1
2
3
double d;
void* p=&d;
double *dp=static_cast<double*>(p);

11、const_cast只能改變運算對象的底層const,如果對象本身是一個常量,使用const_cast執行寫操作就會產生未定義行為。

12、不要使用get初始化另一個智能指針或為智能指針賦值,否則將會產生兩個獨立的shared_ptr指向相同的內存,這將產生未定義行為。

13、delete []p;如果忘記[],其行為是未定義的。 刪除單一對象的指針加[],其行為也是未定義的。

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

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

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

    青山的青6062022-01-04
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

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

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

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

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

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

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

    spring-go5642021-07-02
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

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

    源之緣11542021-10-27
  • C/C++C語言中炫酷的文件操作實例詳解

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

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

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

    謝恩銘10102021-05-08
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

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

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 亚洲 欧美 国产 在线 日韩 | 免费a漫 - 禁密天堂 | 人人最怕九月羊 | 亚洲精品视| 女暴露狂校园裸露小说 | 婷婷色伊人 | 99综合视频 | 门卫老张和女警花小说 | 日韩精品成人免费观看 | 青青热久麻豆精品视频在线观看 | 欧美日韩一区二区三区在线视频 | 手机能看的黄色网站 | aaa一级毛片免费 | 91免费在线 | 俄罗斯毛片免费大全 | 网www天堂资源在线 王淑兰与铁柱全文免费阅读 | 色天天综合网色鬼综合 | 操国产美女 | 2015小明台湾永久区域免费 | 爱爱小说漫画 | 天堂成人在线 | 亚洲欧美专区精品伊人久久 | 好爽好深好猛好舒服视频上 | 日本三级成人中文字幕乱码 | 校花在公车上被内射好舒服 | 亚洲天堂色图 | 色综合久久六月婷婷中文字幕 | 国产视频久久久久 | 456成人免费高清视频 | 91精品国产高清久久久久久 | 秀逼逼| 美女脱衣有肉 | 亚洲国产精品日韩高清秒播 | 天天av天天翘天天综合网 | 无限资源在线观看完整版免费下载 | 国产日本免费 | 国产玖玖在线 | 亚洲 日韩 国产 中文视频 | asspics大尿chinese | 日韩一二三 | 女色在线观看免费视频 |