我有一个虚拟单例,我想为其实现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] 删除。
我来说两句