静态局部变量被重新初始化

马蒂默斯

我有一个虚拟单例,我想为其实现getInstance()静态函数,但是每次调用静态对象时,都会重新初始化静态对象,因此每次获得一个新实例时,任何帮助都将不胜感激-这让我非常困惑。

我要在以下方法中实现该方法的类:

class Pc : public Machine
{
  private:
    ... members ...

  public:
    static Pc* getInstance();

    Pc() {};
    virtual ~Pc() {}

    ... other functions ...
};

父类:

class Machine
{
  public:
    static Machine* getInstance();

    Machine() { }
    Machine(const Machine&) = delete;
    virtual ~Machine() { }

    ... methods ...

    void operator=(const Machine&) = delete;
};

从机器桥接-> PC单例

Machine* Machine::getInstance()
{
    return Pc::getInstance();
}

我有两套用于PC的代码,我相信其中的一套应该可以工作,而我当前的解决方法代码...

非工作代码:

Pc* Pc::getInstance()
{
    static Pc* pc = new Pc();
    return pc;
}

工作(但经过严格处理)的getInstance()代码:

static Pc* pc = nullptr;
Pc* Pc::getInstance()
{
    if(pc == nullptr) {
        pc = new Pc();
    }
    return pc;
}

虽然两者都成功编译,但在中断指向我的代码后,我可以看到期望的代码返回相同的指针,但是在操纵该对象之后,第二次调用返回了一个新对象,这使我相信静态变量已被再次初始化。

编译标志:

-ffreestanding -Wall -Wextra -fno-exceptions -fno-rtti -std=gnu++11 -lgcc

(这是用于OS项目的)

马蒂默斯

好的!经过3天的头部刮擦,我发现了错误的原因!如果您使用--ffreestanding其他代码来编译代码,GCC希望您为自己提供一些功能,以防万一其他人出现了这个(非常晦涩的)错误,我已经将我使用的代码放在了下面(这要感谢osdev.org! !)

__extension__ typedef int __guard __attribute__((mode(__DI__)));

extern "C" int __cxa_guard_acquire(__guard* g)
{
    return !*(char*)(g);
}

extern "C" void __cxa_guard_release(__guard* g)
{
    *(char *)g = 1;
}

extern "C" void __cxa_guard_abort (__guard*)
{
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解局部变量初始化

来自分类Dev

局部变量初始化

来自分类Dev

Bash局部变量初始化

来自分类Dev

线程局部变量的初始化

来自分类Dev

TASM初始化局部变量

来自分类Java

使用局部变量初始化静态变量时

来自分类Java

行为差异:“ null”初始化的最终静态成员和“ null”初始化的最终局部变量

来自分类Dev

默认情况下,C 中未初始化的局部变量是静态的吗?

来自分类Dev

如何在main之前强制初始化静态局部变量?

来自分类Dev

C ++:是否使用IIFE线程安全初始化静态局部变量?

来自分类Dev

在闭包内部初始化局部变量

来自分类Dev

何时在C中初始化局部变量?

来自分类Dev

局部变量可能尚未初始化

来自分类Java

如何避免“局部变量可能尚未初始化”?

来自分类Dev

局部变量保持未初始化

来自分类Dev

隐式类型的局部变量必须初始化

来自分类Dev

隐式类型的局部变量必须初始化

来自分类Dev

未初始化的局部变量,c ++ 11默认

来自分类Dev

未初始化的局部变量c4700

来自分类Dev

使用C ++的未初始化局部变量

来自分类Dev

局部变量初始化和开关选择

来自分类Dev

局部变量 dMetres 可能尚未初始化

来自分类Dev

使用了未初始化的局部变量“xAxis”

来自分类Dev

使用了未初始化的局部变量“totalPrice”

来自分类Dev

C++ 中未初始化的局部变量

来自分类Java

为什么我们不能用从类型变量未初始化的局部变量访问静态内容?

来自分类Dev

重新初始化静态变量

来自分类Java

为什么我们不能通过未初始化的局部变量访问静态内容?

来自分类Dev

在某些情况下,如何理解允许实现将非局部变量的动态初始化视为静态初始化?

Related 相关文章

热门标签

归档