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 при проверке использования памяти с помощью электрического заграждения.
LD_PRELOAD=libefence.so.0.0 ./a.out
Проблема возникает из-за того, что компилятор генерирует код, который начинает выделять новую запись на карте, а затем выполняет foo()
, чтобы получить значение, помещенное в bar[0]
. При запуске foo()
запись уничтожается, и код, наконец, заканчивается записью в нераспределенной памяти.
Способ упорядочения операций зависит от реализации компилятора или задан ли он текущим стандартом С++?