Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 异常处理可能出现的问题_C++_Exception Handling - Fatal编程技术网

C++ 异常处理可能出现的问题

C++ 异常处理可能出现的问题,c++,exception-handling,C++,Exception Handling,这个问题的灵感来自于这篇文章: 由于使用异常而可能出现的其他问题是什么 我的意思是,在使用异常处理时,我们应该记住哪些问题?实际上,如果抛出意外的异常,任何算法都可能中断 例如,算法需要按顺序执行两个操作,第二个操作导致异常-第一个操作不会被取消(除非您处理好),并且程序现在处于不一致状态。在您链接到不一致性的情况下,不一致性表现为内存泄漏—代码旨在释放内存,但由于异常而未运行释放代码 解决方案是预期异常并使用RAII管理资源和状态一致性。例如,如果需要执行两个操作,首先在堆栈上创建一个“括号类

这个问题的灵感来自于这篇文章:

由于使用异常而可能出现的其他问题是什么


我的意思是,在使用异常处理时,我们应该记住哪些问题?实际上,如果抛出意外的异常,任何算法都可能中断

例如,算法需要按顺序执行两个操作,第二个操作导致异常-第一个操作不会被取消(除非您处理好),并且程序现在处于不一致状态。在您链接到不一致性的情况下,不一致性表现为内存泄漏—代码旨在释放内存,但由于异常而未运行释放代码


解决方案是预期异常并使用RAII管理资源和状态一致性。例如,如果需要执行两个操作,首先在堆栈上创建一个“括号类”实例,然后在第二个操作完成后,在该实例上运行一个特殊方法,这意味着两个操作都已成功运行。如果抛出异常,该类的析构函数将回滚第一个操作。

首先,您链接到的内存泄漏问题本身与异常处理无关,只是没有处理您想要运行的某些代码可能被绕过的所有方式。它同样适用于
返回
退出()
,一个
中断
如果
绕过了一些清理代码等-这只是不太明显的例外。RAII是处理此类错误的正常方法(尽管
exit()
阻止某些对象的析构函数运行)

关于例外情况:

  • 它们可以不受破坏,导致程序终止
  • 它们可能被抓在错误的地方,导致不当处理和可能的意外行为
  • 经典的boost::shared_ptr错误:
    f(shared_ptr(新的int(2)),g(),其中g()可能抛出,可能泄漏内存
  • 例外规范通常是不可信的

Bjarne Stroustrup已经制作了(C++编程语言,第三版)。 此外,您必须确保在调用过程中中断函数的异常是无害的。例如,如果您使用RAII(通常推荐的方法)自动释放互斥锁,您可能会在原子操作(从银行帐户1提取的资金)进行到一半时抛出异常,并使系统处于不适当的状态(资金尚未存入银行帐户2)


有其他信息。

问题的出现不是因为使用异常,而是因为异常处理不当。ys我的意思是。。在使用异常处理时,我们要记住的问题是什么?下面将提到的问题适用于任何形式的提前退出。事实证明,异常会在代码执行过程中产生隐藏的流,因此隐藏了“早期退出”点。问题应该是:“为什么RAII使异常处理如此容易”exit()会清除所有内存,因此不会泄漏。不鼓励使用例外规范(而不是怀疑)。共享ptr的问题不是问题。如果您在错误的位置处理异常,那么它就是一个bug。不捕获异常应该终止问题-没有问题that@VJo:是的,但如果您的程序依赖于析构函数的副作用(如在磁盘上写入内容),则析构函数可能未运行,并且您的程序行为可能已被更改。@VJo:异常本身没有什么问题,所以我认为这个问题的意思是“一个新手会做什么,可能会回来困扰他们”。exit()可以绕过释放资源的析构函数,例如在进程之外的共享内存段,以及防止数据刷新、有序断开与其他系统的连接等。。SypDypTR问题是一个问题,或者SyddypTR的主页不会列出它。@ VJO:Read Exchange规范,考虑“道德1:从不写异常规范。道德2:除了可能是空的,但是如果我是你,我甚至会避免这样做。”from.shared_ptr示例是一个问题-按以下顺序计算
f
的参数是合法的:call
new int(2)
call g()
call shared_ptr构造函数