gpt4 book ai didi

c++ - 这个 Singleton 实现有什么问题?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:51 33 4
gpt4 key购买 nike

想法是在程序结束时删除 C++ 中的 Singleton。我们在类里面学习了这种实现方法:

class Singleton
{

private:
static Singleton* the_singleton;

protected:
Singleton()
{
static Keeper keeper(this);
/*CONSTRUCTION CODE*/
}
virtual ~Singleton()
{
/*DESTRUCTION CODE*/
}

public:
class Keeper
{

private:
Singleton* m_logger;

public:
Keeper(Singleton* logger):m_logger(logger){}

~Keeper()
{
delete m_logger;
}
};
friend class Singleton::Keeper;

static Singleton* GetInstance();
{
if (!the_singleton)
the_singleton = new Singleton();
return the_singleton;
}
};

Singleton* Singleton::the_singleton = NULL;

这个想法是,在第一次创建单例时,会在单例的C'tor中创建一个静态的Keeper对象,一旦程序结束,这个Keeper就会被销毁,进而销毁单例的实例它指向。

现在,这个方法对我来说似乎很麻烦,所以我建议放弃 keeper 类并使 Singleton 的实例成为 getInstance 方法的静态对象:

<!-- language: c++ -->

class Singleton
{

protected:
Singleton()
{
/*CONSTRUCTION CODE*/
}

~Singleton()
{
/*DESTRUCTION CODE*/
}

public:
static Singleton &getInstance()
{
static Singleton instance;
return instance;
}

/*OBJECT FUNCTIONALITY*/
};

这样,Singleton 在第一次调用 getInstance 方法时构建,并在程序结束后销毁。不需要那个 Keeper 类。

我对其进行了测试,它工作得很好——在正确的地方创建和销毁了 Singleton。但是,我的助教说这个模式是错误的,虽然他想不起来到底是哪里出了问题。所以我希望这里有人以前遇到过这个实现,可以告诉我它有什么问题。

最佳答案

这是错误的,但您的修改并没有引入问题——它们一直都存在。

目前没有强制执行单例属性。构造函数需要是私有(private)的,而不是 protected ,以确保不会创建额外的实例。


除此之外,原始代码在多线程场景中完全无法使用。 Yours will work beginning with C++0x .


如果 TA 的 keeper 对象将全局指针重置回 NULL,他的实现将能够(在单线程环境中)在程序清理期间根据需要重新创建单例。阅读Singleton pattern in C++ .但这仍然是单例的新实例,这几乎与在调用其析构函数后使用单例一样出乎意料。

但是,他忽略了这样做,所以他会在管理员删除单例后在程序关闭期间愉快地使用无效指针。在您的情况下,即使对象的生命周期已经结束,至少内存区域仍然有效。


你当然会因为使用改进版而被扣分,这只能说明这个类的目的不是教你C++,而是助教对C++的误解。

关于c++ - 这个 Singleton 实现有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6319419/

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