Очень хороший вопрос, спасибо за вопрос. Есть три вопроса, которые я могу придумать. И для каждого вопроса есть два случая.
Переполнения стека: Если ваша программа написана не на языке ассемблера, ОС может обнаружить переполнение стека, поскольку все операции стека операции программного обеспечения . Система времени выполнения управляет программным стеком и знает, когда происходит переполнение.
Если вы взяли на себя труд написать программу на языке ассемблера и попали в аппаратный стек по ошибке, то ОС не сможет вас спасти. Могут случиться плохие вещи.
Доступ к внешней памяти: Когда ваша программа на C ++ запускается, ОС устанавливает ограничения памяти от вашего имени в ЦП. Если ваша программа пытается получить доступ к памяти за пределами этих границ, ЦП вызывает аппаратное прерывание . ОС, которая обрабатывает прерывания, может сказать вам, что ваша программа плохо себя ведет. Вот что происходит, когда вы пытаетесь разыменовать нулевой указатель, например.
Ваша программа на ассемблере, тем не менее, может пытаться читать или записывать из / в любую память, на которую это похоже. Если ваша программа вежлива и была запущена ОС обычным способом, то ОС может перехватить эту ошибку. Но если ваша программа злая и каким-то образом запущена за пределами действия ОС, она может нанести реальный ущерб.
Утечки памяти: Извините, никто не может вам здесь помочь.