程序在释放内存时(在向量的析构函数中)找到了Segmentation Fault的原因。事实证明,begin-iterator 被移动了一个负数,然后在其上记录数据。
问题是,为什么内存错误不是发生在写阶段,而是发生在内存释放阶段?
重现错误的代码:
#include <vector>
#include <iostream>
int main()
{
std::vector <unsigned> vec;
vec.assign(5, 42);
auto it = vec.begin();
std::advance(it, -1);
std::fill(it, vec.end(), 10);
for (const auto &item: vec) {
std::cout << item << " ";
}
std::cout << std::endl;
// наличие вывода показывает, что ошибка не на этапе записи
return 0;
}
你看,你得到了 UB - 未定义的行为。这意味着任何事情都可能发生,在任何时候。
例如,随着您的上诉,您破坏了内存管理器的服务结构。但是这个经理还没有分配或取消分配任何东西,所以它只是没有看到问题。写作阅读定期进行,没有问题出现。
该程序奏效了。退出,调用析构函数。在析构函数中,您需要释放内存 - 但由于服务信息损坏而无法释放它 - 为什么 - 取决于具体的实现,损坏的数据等。是的,没关系 - 它究竟是如何被宠坏的......
所以事实证明,错误(或者更确切地说,UB)是这样表现出来的,在它发生一段时间后。
正如他们所说,如果您想想象在这种未定义的行为情况下会发生什么,可能会发生以下情况。
通常,在分配内存时,系统会返回一个指向客户端的指针,指向已分配的内存,前面有一个前缀,其中包含有关分配了多少内存的信息。
当您尝试在
begin.因此,在删除向量时,使用了这个不正确的分配内存大小值。