У меня есть довольно серьезная ошибка в моей программе - случайные вызовы new() throw bad_alloc.
Из документации, которую я могу найти на bad_alloc, кажется, это брошено по следующим причинам:
-
Когда на компьютере заканчивается память (что определенно не происходит, у меня 4 ГБ ОЗУ, программа бросает bad_alloc при использовании менее 5 МБ (отмечена в диспетчере задач), при этом ничего не работает в фоновом режиме).
-
Если память становится слишком фрагментированной, чтобы выделять новые блоки (что, опять же, маловероятно), блок размером с наибольший размер, который я когда-либо выделял, был бы около 1 КБ, и это не будет сделано более 100 раз перед сбоем имеет место).
Основываясь на этих описаниях, у меня действительно нет нигде, где можно было бы вызвать bad_alloc.
Тем не менее, приложение, которое я запускаю, запускает более одного потока, что может помочь в решении этой проблемы. Проверяя все объекты в одном потоке, все работает нормально. Единственное, что я могу подумать об этом, это может быть какое-то гоночное условие, вызванное вызовом new() в нескольких местах одновременно, но я попытался добавить мьютексы, чтобы предотвратить это поведение никакого эффекта.
Поскольку программа состоит из нескольких сотен строк, и я понятия не имею, где проблема на самом деле, я не уверен, что, если есть, фрагменты кода для публикации. Вместо этого мне было интересно, есть ли какие-либо инструменты, которые помогут мне проверить это, или если есть общие стратегии, которые могут помочь мне с этой проблемой.
Я использую Microsoft Visual Studio 2008 с Poco для потоковой передачи.