C++戻り値が必要な関数に戻り値がない場合の単例パターン
1824 ワード
昨日先日書いたコードを見て、間違いを見つけました.
問題:
プログラムの実行は問題ありませんが、実際には
プログラムが最初に実行されたとき、関数は値を返しませんでした.
しかしpは正しい値を得た.....
------------------------------------------------------------------------------------------------------------
亮盲目は私に説明してくれた.
CPUには、関数の戻り値を格納するレジスタexaがあります.
new操作時にsingletonインスタンスのポインタが返されます.exaに保存します.
でも
関数に戻り値がないので、この関数はexaに格納されている値を返します.の
それで
になる
--------------------------------------------------------------------------------------------------------------
ここでは、なぜプログラムが間違っていないのかを議論するだけです...
コンパイラの様々な警告に対して、できれば警告をエラーに設定しましょう..
#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(); // ,
--------------------------------------------------------------------------------------------------------------
ここでは、なぜプログラムが間違っていないのかを議論するだけです...
コンパイラの様々な警告に対して、できれば警告をエラーに設定しましょう..