问题描述
朋友,
我有以下结构的代码(注意这里有空指针,因为它经常引用其他类似于 KCKey 的结构。为简洁起见,未显示)。
我将这些数组作为全局变量(我不知道最佳实践,但现在让我们继续)。这些全局变量在一个头文件中声明为 extern,并在其他源代码中访问。
问题出在结构 KCKey 中。将“keyprint”变量用作 const char * 时,它可以编译、运行并运行良好。当使用“keyprint”变量作为 QString 时,我得到一个带有以下消息的 SEGFAULT: “下级停止了,因为它收到了来自操作系统的信号。信号名称为 SIGSEV。
代码在“atomic_base.h”中停止。
为什么代码可以使用 const char * 而不是 QString。
我不认为这与内存分配有关,因为:1) 它会因使用 QString 的全局变量的一个实例而崩溃,以及 2) 类似的代码在严格的内存限制下在嵌入式微控制器中使用 std::string 运行良好.
struct KeyCap{
int map;
int row;
int col;
int layer;
int keytype;
void * void_ptr;
};
struct KCKey{
int keycode;
QString keyprint;
};
Map_A.h
#ifndef MAP_A_H
#define MAP_A_H
#include <QString>
#include "structs.h"
extern KCMap Map_A;
extern KCLayer l_aDefault;
extern KCLayer l_aFN;
extern KCLayer l_aNUM;
extern KeyCap Map_A_Default[6][13];
extern KeyCap Map_A_FN[6][13];
extern KeyCap Map_A_NUM[6][13];
//~~~DEFAULT LAYER KEYS~~~~~~~~~~
extern KeyCap AD_00;
extern KeyCap AD_01;
extern KeyCap AD_02;
extern KeyCap AD_03;
Map_A.cpp
#include <QString>
#include "Map_A.h"
#include "keycodes.h"
#include "structs.h"
KCMap Map_A = {l_aDefault,l_aFN,l_aNUM};
KCLayer l_aDefault = {*Map_A_Default[0]};
KCLayer l_aFN = {*Map_A_FN[0]};
KCLayer l_aNUM = {*Map_A_NUM[0]};
KeyCap AD_00 = {zMap_A,1,no_key,&Key_None};
KeyCap AD_01 = {zMap_A,&Key_A};
KeyCap AD_02 = {zMap_A,2,&Key_B};
KeyCap AD_03 = {zMap_A,3,&Key_C};
KeyCap AD_04 = {zMap_A,4,&Key_D};
键码.h
#include <QString>
#include "structs.h"
#include "keycodes.h"
KCKey Key_None = {0,""};
KCKey Key_A = {KEY_A,"A"};
KCKey Key_B = {KEY_B,"B"};
KCKey Key_C = {KEY_C,"C"};
KCKey Key_D = {KEY_D,"D"};
KCKey Key_E = {KEY_E,"E"};
KCKey Key_F = {KEY_F,"F"};
KCKey Key_G = {KEY_G,"G"};
KCKey Key_H = {KEY_H,"H"};
KCKey Key_I = {KEY_I,"I"};
KCKey Key_J = {KEY_J,"J"};
KCKey Key_K = {KEY_K,"K"};
解决方法
我认为问题在于您如何使用 void_ptr。我尝试使用 QString
结构中的 KCKey
派生自您的代码,并且可以正常工作。
#include <iostream>
#include <QString>
struct KCKey{
int keycode;
QString keyprint;
};
KCKey Key_None = {0,"test"};
int main(void)
{
std::cout << Key_None.keyprint.toStdString() << "\n";
return 0;
}