Этот вопрос дает более ясность в отношении описанной проблемы here. Я сделал еще некоторое исследование и обнаружили, что стек разматывания не происходит в следующем фрагменте кода:Распаковка стека в случае структурированных исключений
class One
{
public:
int x ;
};
class Wrapper
{
public:
Wrapper(CString csText):mcsText(csText)
{
CString csTempText;
csTempText.Format("Wrapper constructor :: %s\n", mcsText);
OutputDebugString(csTempText);
}
~Wrapper()
{
CString csTempText;
csTempText.Format("Wrapper destructor :: %s\n", mcsText);
OutputDebugString(csTempText);
}
CString mcsText;
};
class Test
{
public:
void notifyError()
{
try
{
int x = 10;
}
catch(...) {}
}
void OnRecvBuffer()
{
try
{
Wrapper a("AddRef");
One* p = NULL;
p->x = 10;
}
catch(...)
{
notifyError();
}
}
};
int main()
{
Test* pTest = new Test;
pTest->OnRecvBuffer();
OutputDebugString("Test");
}
Я составил этот код, используя VC6 SP5 компилятор и вывод «Упаковочный конструктор :: AddRef !!!» (т. е. деструктор объекта-обертки, который был сконструирован на стеке, не вызывается. Является ли это ожидаемым поведением? или это ошибка с компилятором VC? Могу ли я использовать некоторые флаги компилятора, чтобы в этом случае происходило раскручивание стека?
Исключением является намерение проверить раскрутку стека. Вопрос в том, почему деструктор класса Wrapper не вызван. – Naveen
Как я уже говорил, UB - то, что происходит, когда вы вызываете UB, не определяется. Нет смысла обсуждать это. Есть и другие лучшие способы бросить исключения. – dirkgently
Пример программы вызвал то, что является неопределенным поведением для стандартного C++, но вопрос в том, что Microsoft SEH (структурированная обработка исключений), а не стандартные исключения C++. – bk1e