C++嵌套定义问题引起的栈溢出与std::exception SEH

class Test {
    Test test;
};
error C2460: “Test::test”: 使用正在定义的“Test”

struct Test {
    Test test;
};

        这种定义不应该存在,即使语法不存在问题,运行的时候也会出现问题。如果创建变量的时候,一定会先构造test对象,但是构造test的对象的时候,有需要构造test.test对象,构造test.test的对象的时候,需要先构造test.test.test对象。

#include<iostream>
using namespace std;
class Test {
    Test* test;
public:
    Test() {
        cout << "Test" << endl;
        test = new Test();
    }
};

#include "Test.h"
int main() {
        Test test;
    return 0;
}

出现stack overflow异常。

打印异常: 

#include "Test.h"
int main() {
    try {
        Test test;
    }
    catch (exception e) {
        cout << e.what() << endl;
    }
    return 0;
}

 EXCEPTION_STACK_OVERFLOW不是C++异常,只能用操作系统提供的结构化异常(Structured Exception Handling,SEH)措施来处理。 

VC中捕捉StackOverflow异常_jiangfuqiang的专栏-CSDN博客程序中栈溢出通常会导致进程直接关闭。本文分析Windows中栈增长和溢出过程,并提供一种捕捉栈溢出的方法,作为调试程序的参考。栈大小    VC中,栈大小默认为1M,但可以在编译的时候或在创建线程的时候指定其他值。栈增长和溢出   栈底地址在线程生命期内是常量,栈顶地址保存在SP(ESP、RSP)寄存器。栈地址从高向低增长,因此栈增长,对应着SP寄存器减小。   1M空间只https://blog.csdn.net/jiangfuqiang/article/details/8426196

#include<Windows.h>   
#include"Test.h"
int main() {
    __try {
        // 导致栈溢出的操作
        Test test;
    }
    __except ((GetExceptionCode() == EXCEPTION_STACK_OVERFLOW) ?
        EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    {
        int reset = _resetstkoflw();
        cout << "exception captured!" << endl;
    }
    
}

也可以把SEH转换为std::exception,结合std::exception 和SEh

关于如何使用c++中的try/catch捕获SEH异常并处理_冰糖葫芦的夏天的博客-CSDN博客两者区别:C++异常与SEH区别可参考《Windows核心编程第五版》第25章 25.2节(727页)下面取自原文:注意:C++异常和SEH异常不是同一个东西!!!C++使用try,catch作为关键字进行捕获异常(C++标准自己定义的异常)SEH是Windows操作系统自身使用并提供的一种捕获系统异常的方式,使用__try、__except、__finally、__leave作为关键字进行捕获异常(windows系统定义的异常)无法使用C++异常处理捕获SEH异常,同样SEH异常也无法捕https://blog.csdn.net/shang_cm/article/details/111602984

 开启/Eha选项

C++异常和SEH的结合_郁郁 -CSDN博客https://blog.csdn.net/chenyu2202863/article/details/3260345

C++与SEH异常处理_atceedsun的专栏-CSDN博客参考以下两篇微软的文章:https://blog.csdn.net/atceedsun/article/details/38349645?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242

如何把SEH类型的系统异常转化为C++类型的异常 _网络人生博客的技术博客_51CTO博客_seh如何把SEH类型的系统异常转化为C++类型的异常 ,在上一篇文章中,详细讨论了“SEH与C++异常模型的混合使用”,这一篇文章中,主人公阿愚仍将这一主题继续深入,那就是“如何把SEH类型的系统异常转化为C++类型的异常?”(其实,这本质上仍然属于SEH与C++异常模型的混合使用,也即C++异常模型来捕获SEH系统类型的异常)。为什么要把SEH类型的系统异常转https://blog.51cto.com/xinxin8/789916

结构化异常处理 (C/C++) | Microsoft Docsicon-default.png?t=L892https://docs.microsoft.com/zh-cn/previous-versions/swezty51(v=vs.120)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值