关于使用new在堆空间创建对象的疑问

来源:9-3 static和单例模式的实现

lihsing

2022-12-01

老师,您好。

在单例模式这一节,我看您的实现在getInstance方法里面使用new关键字创建对象。

这个是我的实现:

#include <iostream>


class Singleton {
private:
    static Singleton* _instance;
    Singleton() {}
    ~Singleton() {}
public:
    static Singleton* getInstance() {
        if (!_instance) {
            Singleton tmp = Singleton();
            _instance = &tmp;
        }
        return _instance;
    }
    void sayHello() {
        std::cout << "Hello!" << std::endl;
    }
};


Singleton* Singleton::_instance = nullptr;


int main() {
    Singleton* singleton = Singleton::getInstance();
    singleton->sayHello();
}

也能正常运行,按照之前我们讲的,Singleton tmp = Singleton()语句在函数栈里面创建了tmp对象,脱离该栈之后,tmp将被销毁,那singleton->sayHello();为什么能够运行而且编译器没有报错呢?

我的环境:
操作系统:macOS ventura(13.0.1)
编译器:Apple clang version 14.0.0 (clang-1400.0.29.202)

期待您的解答。

写回答

1回答

quickzhao

2022-12-01

这个代码本身是不可靠的,这里tmp是临时对象,出栈区之后有可能会被回收,属于未定状态,可能导致无法预测的风险问题。

0
0

重学C++ ,重构你的C++知识体系

一部大片,一段历史,构建C++知识框架的同时重塑你的编程思维

3884 学习 · 1103 问题

查看课程