std::map<int,int> bar;
int foo(int key)
{
bar.erase(key);
return 1;
}
int main()
{
bar[0] = foo(0);
return 0;
}
使用 GCC 4.8 编译的这段代码在使用电子围栏检查内存使用情况时出现错误。
LD_PRELOAD=libefence.so.0.0 ./a.out
问题在于编译器生成的代码开始在映射中分配新条目,然后执行foo()
以获取要放入的值bar[0]
。在运行foo()
时,条目被破坏,代码最终以写入未分配的内存而结束。
操作的排序方式是否取决于编译器实现,还是由 C++ 当前标准指定?