(5G|4G)\sDL\s(\d*[.]?\d*)\sUP\s(\d*[.]?\d*)
с флагами gi (глобальные, без учета регистра) должны работать. Вы можете изменить сопоставление цифр, так как я не уверен, обязательно ли это десятичное число или нет.
Но это не конкретно к C++, который не имеет никакой идеи стека.
Стандарт C++ не определяет стек/"кучу". Далее, существует много способов вызвать неопределенное поведение в программе - все из которых могут повредить Ваш стек (это - UB, в конце концов). Короткий ответ - Ваш вопрос слишком неопределенен, чтобы иметь значимый ответ.
Нарушения Одного Правила Определения могут вести для укладки повреждения. Следующий пример выглядит глупым, но я видел его пару раз с различными библиотеками, скомпилированными в различных конфигурациях.
struct MyStruct
{
int val;
#ifdef LARGEMYSTRUCT
char padding[16];
#endif
}
#define LARGEMYSTRUCT
#include "header.h"
//Here it looks like MyStruct is 20 bytes in size
void func(MyStruct s)
{
memset(s.padding, 0, 16); //corrupts the stack as below file2.cpp does not have LARGEMYSTRUCT declared and declares Mystruct with 4 bytes
return; //Will probably crash here as the return pointer has been overwritten
}
#include "header.h"
//Here it looks like MyStruct is only 4 bytes in size.
extern void func(MyStruct s);
void caller()
{
MyStruct s;
func(s); //push four bytes on to the stack
}
Вызывание функции с неправильным соглашением о вызовах.
(хотя это является технически определенным для компилятора, не вопрос C++, каждый компилятор C++ должен иметь дело с этим.)
Взятие указателей для укладки переменных является хорошим путем:
void foo()
{
my_struct s;
bar(&s);
}
Если панель сохраняет копию указателя затем, что-либо может произойти в будущем.
Подведение итогов: повреждение Стека происходит, когда существуют случайные указатели, указывающие на стек.
Хорошим кандидатом является создание исключения внутри деструктора. Это испортит раскручивание стека.