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同样会导致内存错误。
修复步骤
补全类成员声明:在
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(); // 构造函数声明 };如果它是其他类型(比如固定大小数组),也要对应声明正确的类型和大小。
修正数组越界问题:把构造函数里的下标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)); }验证对象作用域:如果
system_information是全局对象,建议先改成局部对象在main里实例化测试,这样能更直观地看到构造函数是否触发错误,方便调试。
额外调试提示
你可以用VS调试器、gdb这类工具查看崩溃时的调用栈,定位到具体的错误位置——内存损坏类的问题往往能通过调用栈和内存窗口快速定位根源。
内容的提问来源于stack exchange,提问作者MoeKav

