Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std:string::substr是异常安全的吗?_C++_String_Exception_Erase - Fatal编程技术网

C++ std:string::substr是异常安全的吗?

C++ std:string::substr是异常安全的吗?,c++,string,exception,erase,C++,String,Exception,Erase,我在std::string中使用substr编写了一些代码 根据: 如果pos大于字符串长度,则引发超出范围异常 正如我已经检查过的,如果我使用以下参数执行此函数: 我执行函数:test.substr(0,test.size()-2) std::string test={“ABC”};结果:测试==“A” std::string test={“AB”};结果:测试==“” std::string test={“A”};结果:测试==“A” std::string test={”“};结果:测试=

我在
std::string
中使用
substr
编写了一些代码

根据:

如果pos大于字符串长度,则引发超出范围异常

正如我已经检查过的,如果我使用以下参数执行此函数:

  • 我执行函数:
    test.substr(0,test.size()-2)

  • std::string test={“ABC”};结果:测试==“A”

  • std::string test={“AB”};结果:测试==“”

  • std::string test={“A”};结果:测试==“A”

  • std::string test={”“};结果:测试==“”

  • 我的结论是:

  • 若原始字符串大小大于或等于2,则函数直接工作
  • 若原始字符串大小小于2,则不会引发异常,但函数返回原始字符串
  • 我的问题:


    将其保留为
    test.substr(0,test.size()-2)是否安全之前未检查其大小?

    这是完全安全的。如果抛出异常,这只是第一个重要参数(除了内存不足的
    bad_alloc
    之外,但您还有其他问题)

    第一个参数必须位于
    [0,size()]
    中。由于您使用
    0
    ,并且
    0
    始终在
    [0,size()]
    中,因此您永远不会抛出
    std::out\u of \u range
    异常


    如果第二个参数大于子字符串的大小,则只需获取完整的子字符串。So
    test.substr(0,test.size()-2)test.size()-2
    是一个非常大的数字(无符号下溢)。

    这是完全安全的。如果抛出异常,这只是第一个重要参数(除了内存不足的
    bad_alloc
    之外,但您还有其他问题)

    第一个参数必须位于
    [0,size()]
    中。由于您使用
    0
    ,并且
    0
    始终在
    [0,size()]
    中,因此您永远不会抛出
    std::out\u of \u range
    异常


    如果第二个参数大于子字符串的大小,则只需获取完整的子字符串。So
    test.substr(0,test.size()-2)test.size()-2
    是一个非常大的数字(无符号下溢)。

    是的,它是安全的,但不是出于您认为安全的原因。

    第一件事:
    std::string::substr
    不是完全异常安全的,如果
    pos
    (即第一个参数)大于
    size()
    ,它将抛出

    其次,
    substr
    的两个参数的类型均为
    std::string::size_type
    ,默认情况下为无符号整数类型。
    因为它是无符号的,下溢是定义良好的,所以
    0-2
    将导致
    std::numeric\u limits::max()-1

    substr()
    的第二个参数没有上限,因此可以用您希望的高值调用它(实际上,默认参数可能是
    std::numeric\u limits::max()


    因此,当您调用
    substr(0,负值)
    时,您会问“给我从索引
    0
    大数字的子字符串”,这可能在所有情况下都会返回整个字符串。

    是的,它是安全的,但不是出于您认为安全的原因。

    第一件事:
    std::string::substr
    不是完全异常安全的,如果
    pos
    (即第一个参数)大于
    size()
    ,它将抛出

    其次,
    substr
    的两个参数的类型均为
    std::string::size_type
    ,默认情况下为无符号整数类型。
    因为它是无符号的,下溢是定义良好的,所以
    0-2
    将导致
    std::numeric\u limits::max()-1

    substr()
    的第二个参数没有上限,因此可以用您希望的高值调用它(实际上,默认参数可能是
    std::numeric\u limits::max()


    因此,当您调用
    substr(0,负值)
    时,您会问“给我从索引
    0
    大数值的substring
    ”,这可能在所有情况下都会返回整个字符串。

    pos>size()时,函数会引发异常。
    在您的示例中,参数
    pos
    始终等于0,则函数是安全的。也就是说,
    pos
    永远不能大于
    size()
    的值

    考虑到第二个参数的定义如下

    basic_string substr(size_type pos = 0, size_type n = npos) const;
                                           ^^^^^^^^^^^^^^^^^^
    
    函数(C++标准)的行为如下

    2效果:确定要复制的字符串的有效长度rlen 作为n和size()中的较小者-pos

    对于这个表达式

    test.size()-2
    
    size()
    具有较大的无符号值时(由于通常的算术转换),其具有无符号整数类型的值小于2。比如说

    #include <iostream>
    #include <string>
    
    int main() 
    {
        std::string s;
    
        auto n = s.size() - 2;
        std::cout << n << '\n';
    
        return 0;
    } 
    
    因此,该函数选择成员函数
    size()
    的值

    这两个例子说明了这种情况

    4)std::string test = {"A"};   result: test == "A"
    
    5)std::string test = {""};    result: test == ""
    

    pos>size()
    在您的示例中,参数
    pos
    始终等于0,则函数是安全的。也就是说,
    pos
    永远不能大于
    size()
    的值

    考虑到第二个参数的定义如下

    basic_string substr(size_type pos = 0, size_type n = npos) const;
                                           ^^^^^^^^^^^^^^^^^^
    
    函数(C++标准)的行为如下

    2效果:确定要复制的字符串的有效长度rlen 作为n和size()中的较小者-pos

    对于这个表达式

    test.size()-2
    
    size()
    小于2时具有无符号整数类型的