C++ ".exe"触发了一个断点 解决

24 篇文章 1 订阅

       碰到这个问题时也是有点懵的,不会提示问题出在什么地方。查了很多,很多博客中说是内存越界导致堆栈损坏,很多跟memset()方法有关,初始化时使用这个方法需要谨慎。

       问题分析:

       但是我这个就很奇怪了,运行时并不会出现这个问题,当运行结束时会出现这个问题。最后我发现问题出现在我定义的一个字符数组上,如果我在方法里面定义局部字符数组或者在cpp文件中定义全局字符数组,然后再使用memset()方法初始化数组,都不会出现这个问题,这样显得很Low。但是当我在头文件中声明字符数组,然后再使用memset()方法初始化数组,就会出现这个问题。

      

       因为我用到了std::thread线程,memset()方法我放在了while循环里,所以我找到了原因

           

       当我把字符数组定义在头文件中,std::thread线程中detach()方法是将子线程脱离主线程,不妨碍主线程的结束和注销,所以,当memset()初始化方法放在while循环中的时候,程序退出,字符数组已经注销了,然后再对它初始化,就会导致内存越界,堆栈损坏。

       解决:

       将memset()方法放在while循环的外面,要保证程序退出时,内存回收的逻辑是对的。

      总结:

      一般出现这个问题还是出现在内存越界上,所以memset()初始化方法谨慎使用。


有问题和建议希望留言提出或者发邮箱给我,虚心倾听学习! 邮箱:1203782828@qq.com


要创建一个断点的类,可以使用C++的面向对象编程思想。以下是一个简单的断点管理类的示例代码: ```cpp #include <iostream> #include <vector> class BreakpointManager { public: void AddBreakpoint(int line) { breakpoints.push_back(line); } void RemoveBreakpoint(int line) { for (auto it = breakpoints.begin(); it != breakpoints.end(); ++it) { if (*it == line) { breakpoints.erase(it); break; } } } void WaitBreakpoint() { int currentLine = GetCurrentLine(); while (!IsBreakpointSet(currentLine)) { // 等待断点触发 // 可以使用条件变量或其他方法进行等待 } } private: std::vector<int> breakpoints; int GetCurrentLine() { // 获取当前行号的方法 // 可以使用__LINE__宏或其他方法获取当前行号 } bool IsBreakpointSet(int line) { for (auto breakpoint : breakpoints) { if (breakpoint == line) { return true; } } return false; } }; int main() { BreakpointManager bpManager; bpManager.AddBreakpoint(10); int x = 0; bpManager.WaitBreakpoint(); // 等待断点1触发 x = 10; bpManager.AddBreakpoint(20); bpManager.WaitBreakpoint(); // 等待断点2触发 x += 5; std::cout << "x = " << x << std::endl; return 0; } ``` 在上面的代码中,我们创建了一个名为 `BreakpointManager` 的类,用于管理断点。它提供了三个公共方法: - `AddBreakpoint(int line)`:用于添加断点。 - `RemoveBreakpoint(int line)`:用于删除断点。 - `WaitBreakpoint()`:用于等待断点触发。 内部实现中,我们使用一个 `std::vector<int>` 来存储断点的行号。`AddBreakpoint` 方法将行号添加到断点列表中,`RemoveBreakpoint` 方法从断点列表中删除指定的行号。`WaitBreakpoint` 方法将循环检查当前行号是否是已设置的断点行号,如果不是,则一直等待。 在示例中,我们创建了一个 `BreakpointManager` 对象 `bpManager`,并使用其方法来设置和等待断点。在主函数中,我们添加了两个断点,分别位于第10行和第20行。在每个断点之前,我们使用 `WaitBreakpoint` 方法来等待断点触发。 请注意,示例中的 `WaitBreakpoint` 方法只是一个简单的示例,它使用一个简单的循环来等待断点触发。在实际的实现中,你可能需要使用更高级的机制(如条件变量)来进行等待。另外,示例中的 `GetCurrentLine` 方法和 `IsBreakpointSet` 方法需要根据你的实际需求进行实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值