В общем, что может привести к двойному освобождению в программе, которая не содержит динамического распределения памяти?двойной свободный без какого-либо распределения динамической памяти
Чтобы быть более точным, ни один из моего кода использует динамическое распределение. Я использую STL, но гораздо более вероятно, что я сделал что-то неправильно, чем для того, чтобы он был сломанным внедрением G ++/glibc/STL.
Я искал, пытаясь найти ответ на этот вопрос, но я не смог найти какой-либо пример генерируемой ошибки без каких-либо распределений динамической памяти.
Я хотел бы поделиться кодом, который генерировал эту ошибку, но мне не разрешено ее выпускать, и я не знаю, как уменьшить проблему до достаточно маленького, чтобы быть здесь. Я сделаю все возможное, чтобы описать суть моего кода.
Ошибка была брошена при выходе из функции, а трассировка стека показала, что она исходит от деструктора std::vector<std::set<std::string>>
. Некоторое количество элементов в векторе инициализировалось emplace_back()
. В последней попытке я поменял ее на push_back({{}})
, и проблема исчезла. Проблем также можно избежать, установив переменную окружения MALLOC_CHECK_ = 2. По моему мнению, эта переменная среды должна приводить к тому, что glibc прерывается с большей информацией, а не заставляет ошибку уходить.
Этот вопрос только просит служить моему любопытству, поэтому я соглашусь на выстрел в темном ответе. Лучшее, что я смог придумать, это то, что это ошибка компилятора, но it's always my fault.
Я наткнулся на множество вопросов и статей о правиле трех. Тем не менее, все из них, включая ваш ответ, связаны с вызовами и удалением. Я готов поверить, что добавление конструктора копирования и оператора присваивания устранило бы мою проблему, но мой вопрос был почему? Я понимаю, что могло произойти с классом, у которого были динамически распределенные элементы, но не тогда, когда все в стеке. –