Класс ExtendedMuxer содержит буфер (член m_buffer) нужный для работы с аудиоданными. Размер буфера устанавливается один раз в конструкторе класса и там же под буфер выделяется память. В каждом методе класса в самом начале стоит проверка и если под буфер не выделена память, то сразу происходит возврат из метода. В методе Finalize, делающем некую очистку, подобная проверка заканчивается не возвратом из метода, а генерацией исключения. Какая строка кода приводит к ошибке компиляции или времени исполнения? Исходник:
class BasicMuxer { /*skipped */ };
class ExtendedMuxer : public BasicMuxer
{
char* m_buffer;
/* code skipped */
public:
ExtendedMuxer(int size);
/* code skipped */
void Finalize() throw(std::exception);
virtual ~ExtendedMuxer();
};
ExtendedMuxer::ExtendedMuxer(int size)
{
if (size < 1024)
m_buffer = new char[size];
else
m_buffer = 0;
/* code skipped */
}
/* code skipped */
void ExtendedMuxer::Finalize() throw(std::exception)
{
if (!m_buffer) throw(new std::exception);
/* code skipped */
}
ExtendedMuxer::~ExtendedMuxer()
{
try
{
Finalize();
}
catch (...)
{
delete[] m_buffer;
throw;
}
delete[] m_buffer;
}
Варианты строк где это может происходить: throw; или в: delete[] m_buffer; или в: catch(...) { или в: if (!m_buffer) throw(new std::exception); или в: void Finalize() throw(std::exception);
Из того, что приведено, ошибка может быть только если в рантайме создавался объект ExtendedMuxer с sizeом больше 1024 (вот тут-то и бросить бы исключение, нет?). Соответственно, при уничтожении объекта, деструктор вызовет Finalize(), Finalize бросит исключение (так как m_buffer равен нулю), деструктор его отловит, и бросит новое. Кем последнее ловится из этого кода не понятно. А вообще, для таких случаев, используйте TRACEы или логи, например.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости