C++戻り値が必要な関数に戻り値がない場合の単例パターン


昨日先日書いたコードを見て、間違いを見つけました.
 
#include <iostream>

using namespace std;



class singleton

{

public:

	static singleton* sharedInstance()

	{

		if (m_ptr==nullptr)

		{

			m_ptr=new singleton(); 



			//       

		}

		else

		{

			return m_ptr;

		}

	}



	void show(){cout<<"singleton is ok"<<endl;};



private:

	singleton()

	{

	};



	static singleton* m_ptr;

};



singleton* singleton::m_ptr=nullptr;



int main()

{

	

	singleton* p=singleton::sharedInstance();



	p->show();



	getchar();



	return 0;

}

問題:
 
 
singleton* p=singleton::sharedInstance();

プログラムの実行は問題ありませんが、実際には
 
 
	static singleton* sharedInstance()

	{

		if (m_ptr==nullptr)

		{

			m_ptr=new singleton(); 



			//       

		}

		else

		{

			return m_ptr;

		}

	}

プログラムが最初に実行されたとき、関数は値を返しませんでした.
 
しかしpは正しい値を得た.....
------------------------------------------------------------------------------------------------------------
亮盲目は私に説明してくれた.
CPUには、関数の戻り値を格納するレジスタexaがあります.
 
m_ptr=new singleton(); 

new操作時にsingletonインスタンスのポインタが返されます.exaに保存します.
 
でも
 
sharedInstance()

関数に戻り値がないので、この関数はexaに格納されている値を返します.の
 
それで
 
singleton* p=singleton::sharedInstance();

になる
 
 
singleton* p=new singleton(); //        ,        

 
--------------------------------------------------------------------------------------------------------------
ここでは、なぜプログラムが間違っていないのかを議論するだけです...
コンパイラの様々な警告に対して、できれば警告をエラーに設定しましょう..