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編譯的代碼segs fault。C++ STL map :: operator []在被刪除的條目上完成
LD_PRELOAD=libefence.so.0.0 ./a.out
的問題來自編譯器生成啓動分配在地圖上一個新條目的代碼,然後執行foo()
去投入bar[0]
價值的事實。在運行foo()
時,條目被破壞,代碼最終通過寫入未分配的內存而結束。
操作的排序方式取決於編譯器實現,還是由C++當前標準指定?
不要做.. –
也http://stackoverflow.com/a/4183735見。 –
研究序列和序列點。在'foo(0)'之前是否會對bar [0]'進行評估,如果是(它看起來像是你),那麼它是未定義的,那麼你就會遇到很大麻煩。 – AndyG