Ваша проблема:
while(1)
{
char *buf = new char[100000000];
}
Вы создали утечку памяти, на каждой итерации вы создаете новый объект, теряя любую ссылку на старый объект.
Разматывание стека, очищает все локальные объекты в этой области,
Dummy dm;
- это объект, размещенный в локальном хранилище внутри InnerFunc()
, разматывание стека справедливо уничтожает этот объект, и единственная трассировка вызова деструктора, которую вы видите, является следствием этого.
Разматывание стека не явно освобождает динамическую память. Каждый указатель, выделенный с помощью new[]
, должен быть явно освобожден путем вызова delete []
по тому же адресу.
Я не вижу, как это связано с какой-либо из функций потоков Windows (я не очень разбираюсь в Windows), но, как я уже говорил, у вас есть проблема.
Решение:
Простое решение для очистки во время исключений - RAII .
Вы должны использовать Smart-указатель , чтобы обернуть ваш необработанный указатель, а затем Smart-указатель гарантирует, что память вашего объекта будет должным образом освобождена после завершения области действия.