Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在使用全局对象时崩溃,但在使用局部对象时不会崩溃_C++_Class_Constructor_Segmentation Fault - Fatal编程技术网

C++ 在使用全局对象时崩溃,但在使用局部对象时不会崩溃

C++ 在使用全局对象时崩溃,但在使用局部对象时不会崩溃,c++,class,constructor,segmentation-fault,C++,Class,Constructor,Segmentation Fault,我正在尝试使用为我的程序创建配置文件。有两种情况,一种工作正常(局部范围对象),另一种失败(全局范围对象)。我试图理解为什么一个失败而另一个成功,因为我的理解是,两者都是创建相同对象的定义(只是在不同的范围内) 第一个(不起作用):我在全局范围中定义了一个配置对象。然后调用Config对象上的readFile。程序在这里崩溃了 #include <libconfig.h++> libconfig::Config cfg; int __attribute__((constructo

我正在尝试使用为我的程序创建配置文件。有两种情况,一种工作正常(局部范围对象),另一种失败(全局范围对象)。我试图理解为什么一个失败而另一个成功,因为我的理解是,两者都是创建相同对象的定义(只是在不同的范围内)

第一个(不起作用):我在全局范围中定义了一个配置对象。然后调用Config对象上的readFile。程序在这里崩溃了

#include <libconfig.h++>

libconfig::Config cfg;

int __attribute__((constructor)) Init()
{
  cfg.readFile("/home/jalius/csgo-internal/hack.cfg");
}
#包括
libconfig::Config cfg;
int uuu属性uuu((构造函数))Init()
{
readFile(“/home/jalius/csgo internal/hack.cfg”);
}
第二(工作):我定义了一个本地配置对象,并对其调用readFile

#include <libconfig.h++>

int __attribute__((constructor)) Init()
{
  libconfig::Config cfg;
  cfg.readFile("/home/jalius/csgo-internal/hack.cfg");
}
#包括
int uuu属性uuu((构造函数))Init()
{
libconfig::Config cfg;
readFile(“/home/jalius/csgo internal/hack.cfg”);
}

无法保证在构建
Config
对象之前,会调用函数
int\uuuuu attribute\uuuuu((构造函数))Init()

当您尝试从中读取时,实际上可能会尝试访问未构造的对象。这将导致未定义的行为

当您在本地创建它时,可以保证您的对象在使用之前将被完全初始化


实验:
当您调用
int\uuuu attribute\uuuu((构造函数))Init()函数时,
cfg
对象不会在您的案例中创建。因为调用属性的顺序是属性<代码>构造函数< /C> >和C++对象(静态存储持续时间)未指定。由于对象不存在,所以您会得到分段错误,即
SIGSEGV
信号

以下摘录自:

<>目前,调用具有静态存储持续时间和函数(属性>代码>构造函数< /代码> >的C++对象的构造函数的顺序是未指定的。在混合声明中,属性
init\u priority
可用于强制特定的顺序


有关更多信息,请参阅上的
constructor
部分。

运行时错误是什么?如何提取该信息?使用dlopen将此共享库插入到另一个进程中。我在进程上打开了gdb,看到主线程在libconfig.c中的某个地方收到了SIGSEGV(我没有调试符号)。
SIGSEGV
signal表示分段错误。有趣。我假设可以保证所有全局变量都会像main一样构造。
#include <iostream>

enum {
    OBJECT_CONSTRUCTOR,
    FUNCTION_CONSTRUCTOR,
};

int order[10], cur = 0;

class TestClass {
  public:
   TestClass() { order[cur++] = OBJECT_CONSTRUCTOR; }
   ~TestClass() { }
};

TestClass abc;
int __attribute__((constructor)) Init() {
   order[cur++] = FUNCTION_CONSTRUCTOR;
}

int main ()
{
    std::cout << "Order of execution:\n";
    for(int i = 0; i < cur; i++)
    {
        switch(order[i])
        {
            case OBJECT_CONSTRUCTOR:
                std::cout<<"Object Constructor\n";
                break;
            case FUNCTION_CONSTRUCTOR:
                std::cout<<"Function Constructor\n";
                break;
        }
    }
    return 0;
}
Order of execution:
Function Constructor
Object Constructor