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={”“};结果:测试==“”
将其保留为
test.substr(0,test.size()-2)是否安全代码>之前未检查其大小?这是完全安全的。如果抛出异常,这只是第一个重要参数(除了内存不足的bad_alloc
之外,但您还有其他问题)
第一个参数必须位于[0,size()]
中。由于您使用0
,并且0
始终在[0,size()]
中,因此您永远不会抛出std::out\u of \u range
异常
如果第二个参数大于子字符串的大小,则只需获取完整的子字符串。Sotest.substr(0,test.size()-2)因为test.size()-2
是一个非常大的数字(无符号下溢)。这是完全安全的。如果抛出异常,这只是第一个重要参数(除了内存不足的bad_alloc
之外,但您还有其他问题)
第一个参数必须位于[0,size()]
中。由于您使用0
,并且0
始终在[0,size()]
中,因此您永远不会抛出std::out\u of \u range
异常
如果第二个参数大于子字符串的大小,则只需获取完整的子字符串。Sotest.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时具有无符号整数类型的