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