我有一个非常简单的程序,我不知道为什么退出时会发生崩溃。
我的主要功能是一个简单的cout<<"Hello world";
但是我添加了另一个cpp文件:
system_information.cpp:
system_information::system_information() {
threadid_processid_map[22]=23;
processor_processid_map[128] = { 0L };
processor_threadid_map[128] = { 0L };
}
头文件看起来像:
system_information.h
class system_information{
public:
DWORD processor_processid_map[128];
DWORD processor_threadid_map[128];
unordered_map<DWORD, DWORD> threadid_processid_map;
system_information();
};
我只是在我的班级实例中声明这个文件:
parse.cpp:
#include "system_information.h"
system_information sys_info;
我的程序在此行的crt0at.c退出时崩溃:
onexitbegin_new = (_PVFV *) DecodePointer(__onexitbegin);
我做错了什么?
答案 0 :(得分:2)
我会说你对什么感到有些困惑:
processor_processid_map[128] = { 0L };
实际上正在做。你在那里有大括号的事实似乎表明你认为它会将数组中的所有值都设置为零但是不是的情况。您可以初始化数组,但分配给它是另一回事。
该代码正在尝试将元素编号128
设置为零,并且由于元素被限制在范围0..127
中,因此您所拥有的是未定义的行为。
如果你做希望将整个阵列归零,有很多方法可以做到这一点,包括:
// Simple loop.
for (int i = 0; i < sizeof(id_map) / sizeof(*id_map); ++i)
id_map[i] = 0;
// Setting memory.
#include <cstring>
memset(id_map, 0, sizeof(id_map));
// Fill algorithm.
#include <algorithm>
std::fill(id_map, id_map + sizeof(id_map) / sizeof(*id_map), 0);