【问题标题】:Delay the construction of a static member object延迟静态成员对象的构造
【发布时间】:2016-08-12 23:12:10
【问题描述】:

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

该项目依赖于一开始就在 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函数调用

注入 dll 后,什么也没有发生(也没有错误消息),但是, 当从apiHelperObject 中删除静态关键字时,一切正常

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

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

所以问题是:

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

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

谢谢

【问题讨论】:

  • “问题似乎是在 API 初始化之前正在构造静态成员” 为什么不呢?它是命名空间静态的。它在其他任何事情发生之前被初始化。停止使用“初始化”函数并正确使用构造函数。
  • 为 type-o 道歉,它不是一个函数声明,已编辑。 api不是我的,必须调用初始化函数

标签: c++ constructor static delay


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多