昨天在看前些天写的代码,发现一个错误。
#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(); //构造函数是私有的,这里只是这样理解
--------------------------------------------------------------------------------------------------------------
这里只是讨论为什么程序没有出错。。。
对于编译器的各种警告,如果可以的话把警告设置成错误吧。。。