我被要求在一项作业中复制std::string
,但实现substr
函数时遇到了问题。教师给我们提供了一组测试数据,其中一个测试数据的length
等于-1
。我的substr
函数声明如下:
Cadena substr(size_t start, size_t length) const;
我曾经认为 size_t
可以防止传入负数值。但问题在于,定义中我检查了 size() < start + length
(假设 tam_
等同于 size()
):
if (tam_ < start + length)
throw std::out_of_range("Error");
在我的系统中,
-1
在 unsigned
中表示为 18446744073709551615
,因此例如假设 start
是 9
且 tam_
是 10
,我期望的结果是:10 < 9 + 18446744073709551615
因此,预期会抛出异常,但实际上我得到的是:
10 < 9 + (-1)
其中一个说法是错误的,并且不会抛出异常。随着函数的继续,它为大小为length + 1
的char数组分配内存,但由于new[]
正常处理size_t
,将其视为应该的18446744073709551615
,这个数字非常大,导致程序崩溃。
我想知道为什么我的期望结果不是正确的。
std::string::npos
感兴趣,它在标准库中执行类似的操作。你可能需要明确检查length
为(size_t)-1
的情况。 - François Andrieuxunsigned
并不能防止负数被传递。它们只会被转换为一个很大的正数。 - Barmarunsigned
类型使用模数算术。 - Barmar