- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 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/
给定一个匹配词“bad”和单词列表“bird”、“cat”、“mug”、“thug”、“irk”、“kin”、“in”、“mad”、“md”从单词列表中尝试形成匹配词。每次您在给定列表中使用单词时,您
我在面试中被问到一个面试问题,但我没有得到解决方案。 以下是示例段落,我们的程序应该给出数学单词的超链接 “网络协议(protocol)驱动程序 - 完全支持 Java 技术的网络协议(protoco
我是一名 CS 学生,大约一周前我买了破解编码面试。我只是在 Big O 章节,我发现了一种算法,据说可以对数字中的数字求和;乍一看,它看起来很困惑,所以我用 Python 运行了它,但它没有按预期运
这是一个我觉得很有趣的面试问题。 编写一个方法,将指向 Node 结构的指针作为参数,并返回传入数据结构的完整拷贝。 Node 结构包含两个指向其他 Node 结构的指针。例如,方法签名可能如下所示:
这是书中的代码 - “Programming Interviews Exposed”第 2 版 - 第 78 和 79 页- 删除指定字符练习(下续) void Main() { string
来自 Cracking the Coding Interview。问题 2.1:编写代码从未排序的链表中删除重复项。这是他们提供的解决方案: public static void removeDupl
我找到了这个问题的解决方案,但它需要 O(n^2)。有没有可能做得更好? 问题:假设我们想找 D 美元。我们有一个包含 N 个元素的数组 A。面额作为美元值存在于数组中,但我们事先不知道确切的面额。然
我正在尝试解决这个问题:https://www.interviewstreet.com/challenges/dashboard/#problem/4f9a33ec1b8ea 假设 A 是 n 个数字
我尝试使用 Cracking the coding interview 中的代码来运行反向字符串函数。我不知道代码是否错误或者我应该使用另一个 IDE(我为此使用了 Xcode 5.2)。我是 C 编
在 Cracking the coding interview 一书的第 259 页,给出了 C++ 中的模板化单例(我不想发布所有代码以防其版权)。 问题是将单例实现为模板,并假设有一个名为 Loc
书上二分查找的递归版本: int binarySearch(int[] array, int target) throws BSException { return int binarySearch(
我正在阅读“Cracking the Coding Interview”一书,在这里我遇到了一些寻求答案的问题,但我需要帮助来比较我的答案与解决方案。我的算法有效,但我很难理解书中的解决方案。主要是我
我正在尝试解决一个面试问题,这样给定的链表需要围绕一个值“x”进行分区。我尝试了一下,但没有得到想要的结果。 class Node(object): def __init__(self, va
You have a stack of n boxes, with widths wi, heights hi, and depths di. The boxes cannot be rotated
You have two very large trees: T1, with millions of nodes, and T2, with hundreds of nodes. Create an
此问题来自 Cracking the Coding Interview 第 6 版,问题 V1.11。 The following code prints all strings of length
页。 Programming interviews exposed book的29有如下示例代码,用于从链表中删除一个元素: bool deleteElement(IntElement **head,
上页。 Cracking the Coding Interview 的 44,有如下算法: int f(int n) { if (n <= 1) { return 1;
假设有一个整数 vector 。现在我们想要合并,我们选择 2 个相邻元素 v[I] 和 v[I+1](对于每个有效的 I)并执行 v[I] = v[I+1] + v[I]。并删除 v[I+1]。继续
我在求职面试中被问到以下问题。 给定一个大小未知的输入数组,开头全为 1,结尾全为 0。从 0 开始查找数组中的索引。考虑数组中有数百万个 1 和 0。即数组非常大......例如数组内容 11111
我是一名优秀的程序员,十分优秀!