C++ 为什么不';当我的自定义分配器使向量溢出时,我不会出现分段错误吗?

C++ 为什么不';当我的自定义分配器使向量溢出时,我不会出现分段错误吗?,c++,c++11,C++,C++11,我已经编写了一个自定义的LinearLocator,用于向量。分配器可以将另一个分配器作为模板/构造函数参数,从中分配其初始存储。现在它使用std::allocator进行初始分配,但当我溢出向量时,它不会给出错误。我知道这是未定义的行为,所以我不能保证segfault,但它始终允许我从向量的开始(大小为64)修改1037600个元素 我打印并修改了每个元素,直到它给我一个错误: 模板 类线性定位器 { 公众: 类型定义T值_类型; 线性定位器() :m_memory{m_alloc.alloc

我已经编写了一个自定义的LinearLocator,用于向量。分配器可以将另一个分配器作为模板/构造函数参数,从中分配其初始存储。现在它使用std::allocator进行初始分配,但当我溢出向量时,它不会给出错误。我知道这是未定义的行为,所以我不能保证segfault,但它始终允许我从向量的开始(大小为64)修改1037600个元素

我打印并修改了每个元素,直到它给我一个错误:

模板
类线性定位器
{
公众:
类型定义T值_类型;
线性定位器()
:m_memory{m_alloc.allocate(N)},m_head{m_memory}
{
}
模板
线性定位器(线性定位器常数和其他)无例外
:m_memory{other.m_memory},m_head{other.m_head}
{}
模板
布尔运算符==(LinearLocator常量和其他)常量noexcept
{
返回m_memory==other.m_memory&&m_head==other.m_head;
}
模板
布尔运算符!=(线性定位器常量和其他)常量无异常
{
返回!(*此==其他);
}
T*分配(常数大小\u T n)
{
uint8_t*内存=静态(m_内存);
uint8_t*头=静态铸造(m_头);
如果(n==0)
{
返回空ptr;
}
如果(n>静态_-cast(-1)/sizeof(T))
{
抛出std::坏数组\新长度();
}
如果(n>n){throw std::bad_alloc();}
如果(memory+Nstd::cout最可能的原因是,当您从
std::allocator
分配空间时,它从操作系统抓取了足够的内存来容纳1037663个元素。当操作系统注意到您请求查看尚未授予您的程序访问权限的内存地址时,就会出现分段错误或
已从操作系统请求其他内存,因此当您超出
向量的边界时,操作系统不会注意到,直到您超出提供给
std::分配器的内存边界为止

未定义的行为是未定义的,而不是“定义为分段错误”.你不能指望任何失败的具体表现。