|
1
2
在堆栈溢出的情况下,您将有一小部分堆栈需要处理。它的堆栈足以启动一个新线程,而这个线程将拥有一个全新的堆栈。从那里开始,你可以在终止之前做你需要做的任何事情。 您无法从堆栈溢出中恢复,这将涉及展开堆栈,但您的整个程序将在进程中被破坏。下面是我为堆栈转储实用程序编写的一些代码:
所有这一切都是获取线程的句柄,因此堆栈转储机制知道要转储哪个线程,启动一个新线程来执行转储/日志记录,并等待它完成(这不会发生,线程调用
为了完整性,
所有这些都是“简单”的函数,不需要很大的工作空间(记住,编译器很可能会内联这些mso,删除函数调用)。相反,你不能破例。这不仅需要更多的工作,而且析构函数还可以做相当多的工作(比如释放内存),这也很复杂。 最好的办法是启动一个新线程,尽可能多地保存关于应用程序的信息,然后终止。 |
|
|
2
1
|
|
|
3
0
堆栈需要是连续的,因此您不能只分配任意内存,而必须分配地址空间的下一部分。 如果您愿意预先分配地址空间(即只保留一系列地址而不实际分配内存),则可以使用 VirtualAlloc .首先,使用mem_reserve标志调用它来留出地址空间。稍后,在异常处理程序中,您可以使用mem-commit再次调用它,以将物理内存分配到预先保留的地址空间。 |
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |