延迟构造静态成员对象

lin*_*o13 1 c++ static constructor delay

该项目被编译成一个dll,可以注入一个可执行文件

该项目依赖于一个API,它在main()的最初初始化,如下所示:

int DLL_main()
{
    TheApi::Initialize();
    AnObject anObjectInstance;
    //..
}
Run Code Online (Sandbox Code Playgroud)

有一个对象使用类似于此的类定义构造:

class AnObject()
{
    AnObject();
    ~AnObject();

    static ApiHelper apiHelperObject; //This object assists in making certain api features easier to use
}

//Inside AnObject.cpp

ApiHelper AnObject::apiHelperObject;
Run Code Online (Sandbox Code Playgroud)

在构造函数中apiHelperObject,有一些API函数调用

注入dll后,没有任何反应(也没有错误消息),但是当从apiHelperObject所有工作中删除静态关键字时,没有任何问题

问题似乎是在初始化API 之前构造静态成员

这是不可能的调用TheApi::Initialize()apiHelperObject因为有多个不同的API帮助对象的构造函数,这将导致TheApi::Initialize()被调用一次以上

所以问题是:

在构造静态成员对象之前初始化api的最佳方法是什么?或者,延迟构建静态成员的最佳方法是什么?

优选地,不使用指针,因为语法不是特别有利的

谢谢

Che*_*Alf 5

在普通的标准C++中,您始终可以static通过将对象设置为访问器函数的本地来延迟对象的初始化.

基本上这是迈耶斯的单身人士:

auto helper_object()
    -> ApiHelper&
{
    static ApiHelper the_object;
    return the_object;
}
Run Code Online (Sandbox Code Playgroud)

这里,在标准C++中,对象在第一次执行时通过声明进行初始化.

但是C++标准并不主动支持动态库,更不用说DLL注入了.因此很难说这将如何发挥作用.注意线程问题.