Singleton* Singleton::instance() {
if (pInstance == 0) {
Lock lock;
if (pInstance == 0) {
Singleton* temp = new Singleton; // initialize to temp
pInstance = temp; // assign temp to pInstance
}
}
コンパイラが冗長な一時を最適化していないとします。スレッド A が入っており、Singleton オブジェクトを割り当てて構築します。このオブジェクトは temp によってポイントされます。その直後に A がプリエンプトされます。ここで、スレッド B がロックを取得し、ログインして、pInstance が NULL であることを確認します。また、Singleton オブジェクトを作成し、既存のポインターを上書きします。現在、メモリリークが発生していると思われます。あなたの意見は何ですか ?完全なソースはこちら: コード リファレンス: http://erdani.com/publications/DDJ_Jul_Aug_2004_revised.pdf