3

我正在编写一些处理 Windows 结构化异常的代码(在我的情况下,_set_se_translator()用于将它们转换为 C++ 异常)。

让我担心的是,当异常发生时,我在传递的异常信息中大量使用了指针。我得到了一个指向结构的指针_EXCEPTION_POINTERS。它包含指向其他两个结构的指针,其中一个可能包含另一个指针字段,该字段使该对象基本上是一个链表。

所有这些指针背后的内存在哪里分配?谁负责解除分配?如果不是我,我可以指望数据有效多长时间以及如何避免泄漏?

我的 se 翻译程序目前看起来像这样:

void se_translator(unsigned int exception_code, struct _EXCEPTION_POINTERS* exception_information) {
    _clearfp();
    throw se_exception(exception_code, exception_information);
};

而这里的担心是要么里面指向的所有数据exception_information都超出了我的catches内的范围,要么它们都会以某种方式泄漏。

如果有一些文档讨论了这一点,我想指出它。

4

1 回答 1

4

堆。异常记录在引发异常之前被压入堆栈。请参阅Win32™ 结构化异常处理深度速成课程。EXCEPTION_POINTERS 是对 SEH 的 EXCEPTION_REGISTRATION 的 Visual C++ 特定扩展:

紧接其扩展的 EXCEPTION_REGISTRATION 结构下方,Visual C++ 推送了两个附加值。在下面的 DWORD 中,它为指向 EXCEPTION_POINTERS 结构(标准 Win32 结构)的指针保留空间。这是调用 GetExceptionInformation API 时返回的指针。

事实上,SEH 只使用堆栈结构,因为在异常情况下是唯一最可靠的内存分配器。不是防犯规的(如果没有用于异常记录的堆栈空间,则您的进程会在没有 oa 跟踪的情况下消失),但它是最好的。

 throw se_exception(exception_code, exception_information);

exception_information将超出我的捕获范围

不,不会的。您的堆栈将如下所示:

somefunction_x::`catch block
DispatchException
RaiseException 
<- exception record is here ->
frame that triggered the SEH raise (c++ throw, AV, stack overflow etc)
caller
somefunction_x
caller
threadentrypoint

但是你正在做的事情是非常不寻常的。通常,翻译人员将像 AV ( ExceptionCodeis EXCEPTION_ACCESS_VIOLATION) 这样的非 c++ 异常转换为特定的 c++ 异常,例如。他们检查异常记录ExceptionCode并引发适当的 C++ 类型异常。

于 2012-09-19T20:17:55.393 回答