(VS报错)已在 xxxxx.exe 中执行断点指令(__debugbreak()语句或类似调用)-解决方法&&C++创建对象四种方式

文章讲述了作者解决代码运行时内存分配错误的经历,涉及析构函数、动态创建对象和不同对象创建方式的区别,强调了new和delete的配合以及内存管理的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 前言

📢博客主页:程序源⠀-优快云博客
📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!

今天在写代码运行程序的时候弹出了一个这样的报错。

其实这个报错已经不是我第一天遇到了,只是以前可能直接copy了我同学的代码就过了

但是今天正好有空,于是打算自己查一查。

一开始查到的是delete有问题,但是我的delete检查了之后发现没有问题呀,我甚至直接删除掉delete,不释放空间了也会有报错。

但是最后通过调试,重新又看了一遍书上的知识点,问了AI,终于把问题给解决了

上述报错困扰了我好几天,在网上搜了一天,到最后还是没有解决问题

试过通过项目属性->C/C+±>代码生成->启用增强指令集->选择AVX,这种方法也没用

但问题出现在创建对象时内存分配问题上

也可能是下面这篇文章讲的,动态创建数组之后,delete出现问题

http://t.csdnimg.cn/SObJI

解决方案:

方法一:

 如果是这样创建对象,并且写了析构函数会报错,把析构函数删去之后程序就能正常运行了。

方法二:

创建对象的方式改为这样,程序也可以正常运行了

复习一下创建对象的四种方式

给定类的定义如下

class Test{
    private:
        int a;
    public:
        Test();
        ~Test();
}

 方式一:栈中分配内存,隐式调用构造函数;

Test A;

方式二:栈中分配内存,显式调用构造函数;

Test test = Test();

方式三:堆内存中分内存,使用new关键字显式调用构造函数;

Test *test = new Test;
delete Test;

方式四:其他

  • 很不常用的情况:利用对象指针;但在栈中分配内存(本质和前面两种一样,不过多了一个对象指针来操作而已)
// 很不常用的情况:利用对象指针;但在栈中分配内存
(本质和前面两种一样,不过多了一个对象指针来操作而已)
Test test1;
Test *test2 = &test1;

注意点:

注意1【普通对象(方式1/2)与对象指针(方式3/4)区别】
  • 方式1/2/4:使用完后不需要手动释放,该类析构函数会自动执行
  • 方式3:new申请的对象,则只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。【new和delete必须配合使用
注意2【普通对象(方式1/2)与对象指针(方式3/4)访问类中成员的区别】:
  • 创建对象以后,可以使用点号.来访问成员变量和成员函数,这和通过结构体变量来访问它的成员类似
  • 有了对象指针后,可以通过箭头->来访问对象的成员变量和成员函数,这和通过结构体指针来访问它的成员类似
注意3【关于方式3和方式4的说明】:
  • 在栈上创建出来的对象都有一个名字,比如 test1,test2,使用指针指向它不是必须的。
  • 但是通过 new 创建出来的对象就不一样了,它在堆上分配内存,没有名字,只能得到一个指向它的指针,所以必须使用一个指针变量来接收这个指针,否则以后再也无法找到这个对象了,更没有办法使用它。
  • 也就是说,使用 new 在堆上创建出来的对象是匿名的,没法直接使用,必须要用一个指针指向它,再借助指针来访问它的成员变量或成员函数。
注意4【只定义类指针

这跟不用new申明对象有很大区别,类指针可以先行定义,但类指针只是个通用指针,在new之前并为该类对象分配任何内存空间。比如:

Test* ptest = NULL;

  • 但使用普通方式创建的类对象,在创建之初就已经分配了内存空间。而类指针,如果未经过对象初始化,则不需要delete释放。

参考文章链接:https://blog.youkuaiyun.com/weixin_52028906/article/details/124513418

### 解决Visual Studio 中 `__debugbreak()` 断点指令触发问题 当遇到 `__debugbreak()` 指令未能按预期工作的情况时,可以通过一系列方法来排查并解决问题。 #### 1. 验证编译配置 确保项目是在调试模式下编译的。发布模式下的优化可能会阻止断点正常工作[^1]。如果使用的是C++代码,则应确认项目的属性页中的“生成”选项卡里,“优化级别”被设为禁用(/Od),并且启用了调试信息(/Zi)。 #### 2. 检查异常设置 `__debugbreak()` 函数会在处理器层面引发一个软件中断(通常是INT 3),这会被操作系统捕获作为一次异常事件处理。因此,在Visual Studio中打开“调试->窗口->例外设置”,验证是否已经勾选了“Win32 异常”的子项“0x80000003: 断点”。如果没有启用此选项,那么即使遇到了`__debugbreak()`也不会停止程序运行[^2]。 #### 3. 调试器附加方式 对于托管应用程序(.NET), 确定正确类型的调试器已被附加上去——即本机(Native)+托管(Managed)。有时候,默认情况下只选择了其中一个类别,而忽略了另一个可能导致无法响应特定类型的断点命令。 #### 4. 查看调用堆栈 利用调用堆栈视图(`Ctrl+Alt+C`) 来追踪到实际发生的地方,并检查是否有任何意外的行为发生在调用链路上;比如函数指针间接跳转者其他形式的动态分派机制可能绕过了期望的位置。 ```cpp // 示例 C++ 代码展示如何手动插入 __debugbreak() void SomeFunctionThatShouldBreakHere() { // 前置操作... __debugbreak(); // 这里应该打断 // 后续操作... } ``` #### 5. 更新IDE及相关组件 保持使用的集成开发环境及其扩展处于最新状态可以帮助避免因已知缺陷引起的麻烦。定期访问微软官方渠道获取最新的补丁包和服务更新。 #### 6. 社区支持资源 最后但同样重要的一点是,不要忘记求助于更广泛的开发者群体。无论是通过MSDN论坛还是像StackOverflow这样的在线问答平台,分享具体的症状描述以及尽可能多的相关细节往往能更快找到解决方案。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值