Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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++_C++11 - Fatal编程技术网

C++ 捕获写入访问异常不会导致';行不通

C++ 捕获写入访问异常不会导致';行不通,c++,c++11,C++,C++11,在这里,我试图捕获写入访问冲突,但它不起作用。我尝试过其他方法,但没有一种对我有效。你能解释一下它应该如何工作吗 int main(){ int *pint = new int(); delete pint; try { *pint = 100; } catch (...) { cout << "this is the one " << endl; } } intmain

在这里,我试图捕获写入访问冲突,但它不起作用。我尝试过其他方法,但没有一种对我有效。你能解释一下它应该如何工作吗

int main(){
    int *pint = new int();

    delete pint;

    try
    {
        *pint = 100;
    }
    catch (...)
    {
        cout << "this is the one " << endl;
    }
}
intmain(){
int*pint=新int();
删除品脱;
尝试
{
*品脱=100;
}
捕获(…)
{

当你做非法的事情时,CUT

C++不抛出运行时异常(读:使用未定义行为的东西)。这只是java的事情。C++中,这是不会发生的。< /P> 当您编写

*pint=100;
时,您将100分配给不再拥有的内存,一个可能的结果是内核将向应用程序发送一个SIGSEGV,有效地杀死它,因为它访问了它不拥有的内存。虽然有一些方法可以捕获该信号,因此您可以使用它,但不建议使用-y你很少有真正的理由这么做


但是您不能使用
try catch
,因为不会引发任何异常。程序也可以继续执行,您没有任何保证。

内存访问冲突具有未定义的行为-因此,它们没有指定为引发。不可能捕捉未引发的内容


<> P> >没有检测方法是否在标准C++中发生内存冲突(或任何其他未定义行为)-尽管有外部工具可用于调试程序:

此“免费使用”引爆未定义的行为。它不会导致C++异常被抛出。因此没有什么可以捕获的。在C++中,唯一的方法就是在头上射击自己,首先不要被头部击中。因为一旦子弹穿透颅骨并在相反的一侧出口,它将不可逆地破坏足够的神经物质,以致于无法恢复到可用状态。因此,你不能在HEA中被射中。d、 谢谢你。你能告诉我如何处理这个问题吗。我怎样才能抓住这种情况。我正在编程windows@Hara您应该使用Windows SDK中提供的
应用程序验证程序
,它可以捕获多种内存使用问题。@user207933 True,已修复。谢谢:)@Rakete1111 Nice:)另一个nit:在处理SIG时SEGV理论上是可能的,我不建议使用它。它在“这里是龙”领域,可能会让初学者陷入陷阱。@Hara-处理这个问题的方法是避免问题。如果你不使用原始指针
new
delete
,它永远不会发生。