主运行前结构全局变量中带有 QString 的 QT Segfault

问题描述

朋友,

我有以下结构代码(注意这里有空指针,因为它经常引用其他类似于 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;
}