Я не верю, что для Visual C ++ или почти для всего, что работает на современных платформах Windows (или древних 32-битных OS / 2), потому что на этих платформах стек растет динамически, то есть выделяется новая страница стека только когда ваша программа пытается получить доступ к так называемой защитной странице, блоку размером 4 КБ (для 32-разрядной Windows в любом случае) специально созданной памяти в верхней части выделенного в данный момент фрагмента стека. Операционная система перехватывает исключение, которое генерируется, когда ваша программа пытается получить доступ к этой защитной странице, и (1) отображает новую страницу нормального, действительного стека вместо нее над вершиной выделенного в настоящее время стека, и (2) создает другую Защитная страница чуть выше новой вершины, поэтому она может увеличивать стек по мере необходимости позже. ОС делает это до тех пор, пока стек не достигнет своего предела, и обычно этот предел устанавливается очень высоким.
И если ваша программа пытается получить доступ к любому адресу, который принадлежит нераспределенной части стека, но находится над защитной страницей, ваша программа завершится сбоем, потому что ОС не может это интерпретировать. Ваша программа просто пытается получить доступ к памяти за пределами своего адресного пространства, даже если указатель теоретически принадлежит сегменту стека задачи.
Однако, если вам нужен способ узнать, принадлежит ли адрес выделенной части стека (т. Е. «Объекту в стеке»), ссылка на блог Джо Даффи хороша. Только не используйте StackLimit, описанный там, получите текущую вершину стека, используя другие, уже описанные в этом потоке, методы, так что вы работаете с выделенной частью стека, а не со всей, возможно частично нераспределенной, одной