栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
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   
#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 Docshttps://docs.microsoft.com/zh-cn/previous-versions/swezty51(v=vs.120)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/291753.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号