关于使用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是临时对象,出栈区之后有可能会被回收,属于未定状态,可能导致无法预测的风险问题。
00
相似问题