gpt4 book ai didi

c++ - 延迟构造静态成员对象

转载 作者:行者123 更新时间:2023-11-30 01:10:02 34 4
gpt4 key购买 nike

项目编译成dll注入(inject)可执行文件

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

int DLL_main()
{
TheApi::Initialize();
AnObject anObjectInstance;
//..
}

有一个对象是用类似这样的类定义构造的:

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

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

//Inside AnObject.cpp

ApiHelper AnObject::apiHelperObject;

apiHelperObject的构造函数中,调用了一些API函数

注入(inject) dll 后,没有任何反应(也没有错误消息),但是,当从 apiHelperObject 中删除 static 关键字时,一切正常

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

不可能在 apiHelperObject 的构造函数中调用 TheApi::Initialize(),因为有多个不同的 api 帮助对象,这会导致 TheApi::Initialize() 被多次调用

所以问题是:

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

最好不要使用指针,因为语法不是特别受欢迎

谢谢

最佳答案

在普通的标准 C++ 中,您始终可以延迟 static 对象的初始化,方法是将其设为访问器函数的本地对象。

本质上这是迈耶斯的单例:

auto helper_object()
-> ApiHelper&
{
static ApiHelper the_object;
return the_object;
}

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

但 C++ 标准并不积极支持动态库,更不用说 DLL 注入(inject)了。所以很难说这将如何发挥作用。当心线程问题。

关于c++ - 延迟构造静态成员对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38927599/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com