C++:访问空字符串的元素时,没有错误,为什么?

G.y*_*ang -1 c++ string

#include <iostream>
#include <string>
using std::string;
int main(){
    string s;
    std::cout << "size:" << s.size() << " "
                      << "capacity:" << s.capacity() << std::endl;
    std::cout << s[3] << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我定义了一个名为s的空字符串对象.两者s.size()s.capacity(),但是,当访问所述元件S [3] ,不存在段错误,为什么呢?

Lig*_*ica 5

撇开(正如其他人所解释的)这是UB和(在学术上说)任何事情都可能发生的事实,在这个特定情况下你没有得到分段错误的具体原因是操作系统没有检测到所有内存访问您分配的对象之外-它只有当你的无效的内存访问是检测这样不对,它是为0x0或虚拟内存的另一页完全,一个与你的过程是不是摆设.这是存在的唯一"自动"内存错误检测级别.

除此之外,您的计算机必须检查每个内存访问并将其与免费存储中分配的块映射进行比较(这非常慢;您可以在使用电栅栏valgrind等工具进行调试时执行此操作)或你必须自己添加索引检查(例如使用.at()而不是[]).

C++在某种程度上是一种安全的语言,但是仍有许多功能让人感到"勉强",继承自C,你负责知道自己在做什么,并且不能依赖你的计算机来告诉你什么时候你做错了.