gpt4 book ai didi

c++ - 书 "Cracking the coding interview"中单例示例中的错误/问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:35:57 24 4
gpt4 key购买 nike

在 Cracking the coding interview 一书的第 259 页,给出了 C++ 中的模板化单例(我不想发布所有代码以防其版权)。

问题是将单例实现为模板,并假设有一个名为 Lock 的类,确保其线程安全和异常安全。

答案如您所料,对于使用双重锁定技术的单例,Lock 对象具有 acquire()/release() 对。

但是这个类没有析构函数。这是不是一个错误?如果它有一个析构函数,因为类实例成员是静态的,析构函数只会在程序终止时被调用,如果程序正在终止,任何分配的内存都会被释放回系统。或者会吗?是否存在这种情况无法发生并且没有析构函数的单例因此导致泄漏的情况?

其次,问题是让单例异常安全。单例对象是使用未捕获的新对象创建的,并且 Lock 对象是静态的,因此这实际上是异常安全的吗?如果没有用于创建单例的内存,那么 new 会抛出异常,但由于 Lock 对象是静态的,因此无法调用其 release() 方法,因此它永远不会被调用?

最佳答案

首先,我要提醒的是,Singleton 被广泛认为是一种反模式——从这开始似乎是个好主意,但结果往往是错误的。

其次,如果没有看到代码很难确定,但我的直接猜测是,如果你想让它异常安全,你可能最好将他们提供的锁对象包装在一个 RAII 包装器中,该包装器释放锁它的驱动程序:

class real_lock {
Lock lock;
public:
real_lock() { lock.acquire(); }
~real_lock() { lock.release(); }
};

有了它,异常安全(至少 Lock 部分)就相当简单了。 OTOH,双重检查锁定几乎也是一种反模式。您使用它所做的几乎所有事情都至少有可能在某些机器上/在某些情况下出现问题。

关于c++ - 书 "Cracking the coding interview"中单例示例中的错误/问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4419759/

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