gpt4 book ai didi

c++ - StackOverflowException 期间的向量化异常处理

转载 作者:可可西里 更新时间:2023-11-01 10:10:08 24 4
gpt4 key购买 nike

如果我已经注册了自己的 vector 异常处理程序 (VEH),并且在我的进程中发生了 StackOverflow 异常,当我到达 VEH 时,我是否能够在堆栈上分配更多内存?分配会导致我覆盖其他一些内存吗?会发生什么?
我知道在 .Net 中,这就是为什么在线程创建期间提交整个堆栈的原因,但是假设我正在用 native 编写并且发生这种情况......我将能够在 VEH 中做什么?内存分配如何……?

最佳答案

在堆栈溢出的情况下,您将有一小部分堆栈可以使用。它的堆栈足以启动一个新线程,该线程将拥有一个全新的堆栈。从那里,您可以在终止之前做任何您需要做的事情。

你无法从堆栈溢出中恢复,它会涉及展开堆栈,但你的整个程序会在进程中被破坏。这是我为堆栈转储实用程序编写的一些代码:

// stack overflows cannot be handled, try to get output then quit   
set_current_thread(get_current_thread());
boost::thread t(stack_fail_thread);

t.join(); // will never exit

这一切所做的就是获取线程的句柄,以便堆栈转储机制知道要转储哪个线程,启动一个新线程来执行转储/日志记录,并等待它完成(这不会发生,线程调用 退出())。

为了完整性,get_current_thread() 看起来像这样:

const HANDLE process = GetCurrentProcess();
HANDLE thisThread = 0;
DuplicateHandle(process, GetCurrentThread(), process,
&thisThread, 0, true, DUPLICATE_SAME_ACCESS);

所有这些都是不需要太多工作空间的“简单”函数(请记住,编译器可能会内联这些 msot,从而删除函数调用)。相反,您不能抛出异常。这不仅需要更多的工作,而且析构函数可以做相当多的工作(如释放内存),这往往也很复杂。

最好的办法是启动一个新线程,尽可能多地保存有关您的应用程序的信息,然后终止。

关于c++ - StackOverflowException 期间的向量化异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1897301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com