c++调试中断异常

Posted

技术标签:

【中文标题】c++调试中断异常【英文标题】:c++ debug break exception 【发布时间】:2016-11-28 14:45:57 【问题描述】:

我正在使用 Visual Studio 编写 C++ 代码

我有以下代码

// fondamentaux C++.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
//initialisation des variables

        int total 0 ;
        int tab[5] 11,22,33,44 ;

//on double la valeur de l'index pour additionner les valeurs entre elles

(*tab) = 2;

//boucle pour additionner les valeurs entre elles
        for (int i = 0; i < sizeof(tab); i++)
        
            total += *(tab + i);
        

//libérationn de l'espace mémoire
        delete[] tab;
        *tab = 0;


//affichage du total
        cout << "total = " << total << "\n"; // le total est 121
        return 0;

理论上一切都应该正常,但是当我尝试使用本地调试器启动时 error message

如何调试它?

【问题讨论】:

你只有deletenew,所以delete[] tab;是不正确的。 另外,进入你的程序或者在第一行设置一个断点,然后逐行执行直到你看到问题。 谢谢它的工作 ;) 当您遇到这样的意外断点时,请始终查看“输出”窗口。毫无疑问,您会看到来自 Debug Heap 的消息,告诉您代码中的 UB。 @Zatharan,就像 crashmstr 和 Nikolay Jambazov 的建议一样,这与您的代码有关,您可以在使用 new 分配内存时调用 delete 数据。 Nikolay Jambazov 发布了答案。 【参考方案1】:

'tab'指针指向分配在栈中而不是在堆中的内存,所以函数退出后内存会自动释放。调用

delete[] tab;

错了。不用调用,内存会自动释放。

*tab = 0;

也是错误的,因为这样定义,指针是'const'。 如果你想在堆中分配内存,你应该这样做:

int* tab = new int[5] 11,22,33,44 ;

你的其余代码都可以工作。

【讨论】:

以上是关于c++调试中断异常的主要内容,如果未能解决你的问题,请参考以下文章

DebugBreak 不中断

C++栈回溯原理

调试器不会因异步方法中的异常而中断/停止

防止 Visual Studio 调试因明显的“未处理异常”而中断

检查 DataReader 中是不是存在列或不使调试器在某些异常上中断

利用异常实现反调试