簡體   English   中英

字符串的out_of_range異常

[英]out_of_range exception with strings

我試圖理解字符串中的out_of_range異常

#include<iostream>
#include<exception>
using namespace std;

int main()
{
    try{
        string str = "Hello";
        str.at(100);//throws exception and get caught
        //str[100]; //this is a run time error, program crashes
    }
    catch (out_of_range &e)
    {
        cout << e.what() << endl;
    }

}

為什么不對字符串進行數組訪問會引發任何異常並崩潰,而.at可以正常工作?

IDE:VS2013

這是因為[]運算符不檢查任何內容,而at()則檢查任何內容。 CppReference說:

std :: basic_string :: at

返回對指定位置pos處字符的引用。 執行邊界檢查,無效訪問將引發類型為std :: out_of_range的異常。

std :: basic_string :: operator []

返回對指定位置pos處字符的引用。 不執行邊界檢查。

std::string::atstd::string::operator[]工作原理不同。

  • at(size_t)方法檢查字符串的當前大小:如果字符串超出范圍,它將拋出異常。

  • operator[](size_t)是對內存塊的直接訪問。 因此問題可能出在運行時。

std :: string :: operator []

std :: string :: at

使用長度為n的字符串s ,您可以使用[]at ,以明確定義的行為訪問索引0到n -1(含)之間的項。

確保通過[]訪問索引n處的項目(1)會產生對零對象的引用,而通過at (2)進行訪問則保證會引發out_of_range異常。

前一種行為是為了與C編程的期望兼容,而后一種行為是為了確保正確性。

實際上,對於任何范圍從0到n -1的索引,保證at方法可以引發out_of_range異常。

使用[] ,您要訪問的索引(3) 必須在0到n之間 這意味着使用超出該范圍的索引是未定義行為。


1)關於basic_string::operator[] C ++ 14 21.4.5 / 2:“如果pos < size()返回*(begin() + pos) pos < size() 否則,返回到類型的對象的參考charT與值charT()其中,修改所述對象導致未定義的行為”。
2) C ++ 14 21.4.6 / 5關於basic_string::at :“如果pos >= size()拋出out_of_range ”,其中索引類型是無符號的。
3)關於basic_string::operator[] C ++ 14 21.4.5 / 1:“ 要求pos <= size 。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM