You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++程序退出崩溃求助:极简主函数引入自定义类后异常

问题分析与解决方案

看起来你的程序退出崩溃的核心问题出在system_information类的定义和构造函数的不匹配上,咱们一步步拆解:

核心问题

你在system_information.cpp的构造函数里操作了threadid_processid_map[22]=23;,但在对应的头文件system_information.h里,只声明了processor_processid_map和processor_threadid_map这两个数组,完全没有定义threadid_processid_map这个成员变量!

这种情况下,构造函数里对threadid_processid_map的赋值操作属于非法内存访问——程序会去读写不属于这个类对象的内存区域,直接破坏程序的内存结构。即使你的main函数只有一行cout,如果system_information是全局对象(或者被其他全局代码实例化),程序启动时会执行它的构造函数悄悄破坏内存,等到程序退出清理资源时,就会触发崩溃。

另外还有个细节问题:你在构造函数里写的processor_processid_map[128] = { 0L };和processor_threadid_map[128] = { 0L };也存在数组越界——这两个数组的大小是128,合法下标范围是0到127,访问下标128同样会导致内存错误。

修复步骤

  1. 补全类成员声明:在system_information.h里添加threadid_processid_map的定义,假设它是std::unordered_map<DWORD, DWORD>类型,代码如下:

    #include <unordered_map>
    #pragma once // 头文件保护,避免重复包含
    
    class system_information{
    public:
        std::unordered_map<DWORD, DWORD> threadid_processid_map; // 补上缺失的成员
        DWORD processor_processid_map[128];
        DWORD processor_threadid_map[128];
        system_information(); // 构造函数声明
    };
    

    如果它是其他类型(比如固定大小数组),也要对应声明正确的类型和大小。

  2. 修正数组越界问题:把构造函数里的下标128改成合法范围(0-127),或者直接初始化整个数组:

    system_information::system_information() {
        threadid_processid_map[22] = 23;
        // 用memset初始化整个数组为0
        memset(processor_processid_map, 0, sizeof(processor_processid_map));
        memset(processor_threadid_map, 0, sizeof(processor_threadid_map));
    }
    
  3. 验证对象作用域:如果system_information是全局对象,建议先改成局部对象在main里实例化测试,这样能更直观地看到构造函数是否触发错误,方便调试。

额外调试提示

你可以用VS调试器、gdb这类工具查看崩溃时的调用栈,定位到具体的错误位置——内存损坏类的问题往往能通过调用栈和内存窗口快速定位根源。

内容的提问来源于stack exchange,提问作者MoeKav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:49:45