zoukankan      html  css  js  c++  java
  • 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(); //构造函数是私有的,这里只是这样理解

    --------------------------------------------------------------------------------------------------------------

    这里只是讨论为什么程序没有出错。。。

    对于编译器的各种警告,如果可以的话把警告设置成错误吧。。。

  • 相关阅读:
    计算器部分代码
    学写压缩壳心得系列之二 掌握PE结构 ,曲径通幽
    headerfiles
    VC实现文件拖拽
    学写压缩壳心得系列之三 模拟加载,步步为营
    ASPack 2.x (without poly) > Alexey Solodovnikov [Overlay]脱壳
    学写压缩壳心得系列之一 熟悉概念,未雨绸缪
    upx最新壳脱壳测试
    正则表达式大全
    win7 iis http 500 错误
  • 原文地址:https://www.cnblogs.com/riasky/p/3471677.html
Copyright © 2011-2022 走看看