什么是C ++字符串的默认容量?

时间:2017-09-15 22:35:28

标签: c++

请考虑以下代码段:

string line; 
line = "";
cout << line[400] << endl; //Works, random character 
cout << line[20000] << endl; //Segmentation Fault

看起来c ++字符串具有默认容量,可以防止在超出边界时发生不良事件。但我找不到关于这个主题的更多资源。

我在mac环境下用clang编译了代码片段。

3 个答案:

答案 0 :(得分:2)

嗯,标准根本没有提供默认容量。

许多实现虽然执行小字符串优化(SSO),但它们具有(相对较小的)最小容量而无需任何额外分配。

你所经历的是不相关的事情:
未定义的行为

正如名字所说,任何事情都可能发生,无论你是否期望。你的字符串后备存储很可能被更大量的可寻址内存所包围,但无论你的任意读数是否随之而来,都是随意的。

答案 1 :(得分:1)

正如评论中所解释的那样,标准中没有定义默认容量,因此您当前问题的答案是&#34;没有&#34;。 您所看到的结果只是未定义的行为,因此无法得出有用的结论。

但是,为了尝试回答隐含的基本问题(&#34;正在进行什么?&#34;),通常会在违反页面边界时生成分段错误 - 而不是在访问&#时34;除了应该分配给变量&#34;之外,所以容量实际上并不相关。

您可能看到的是line.c_str() + 400仍然在页面上,但是当您进一步向20000字节移动时,您可能会偏离,因此您获得了SigSeg。但是,是的,未定义的行为锤击下来并把这一切都打成了猜测。

答案 2 :(得分:0)

许多人说,使用超出字符串大小的std::string方法访问operator[]是未定义的行为。遇到未定义的行为时,程序可以执行任何操作,包括擦除所有文件。 (它不会,但允许这样做。)要安全地访问可能在字符串范围之外的字符,请使用at而不是operator[]

但是,要回答原始问题,可以通过调用字符串上的std::string来确定max_size()的最大大小。有关详细信息,请参阅max_size()