我的C++懒汉式单例模式代码编译报链接错误,请问是什么问题?
问题原因及修复方案
你遇到的链接错误及代码问题共2处:
- 静态类成员变量未在类外初始化:C++规则中,类内声明的非const静态成员变量仅属于声明,必须在类外部单独定义分配内存空间。你只在
singleton_l类的private段声明了static singleton_l* Instance;,没有类外定义的实体,链接器找不到对应符号就会抛出你遇到的报错。 - 静态成员函数调用方式错误,存在野指针风险:
GetInstance是类的静态成员函数,本身不属于某个对象实体,你定义的s1是未初始化的野指针,直接用s1->GetInstance()属于未定义行为,就算语法通过后续调用show()也会触发崩溃。
修复后可正常运行的代码
#include <iostream> using namespace std; class singleton_l //lazy { private: singleton_l(){cout << "lazy singleton created" << endl;} ~singleton_l(){} static singleton_l* Instance; public: static singleton_l* GetInstance() { if (Instance == nullptr) Instance = new singleton_l(); return Instance; } void show() { cout << "I'm a instance of singleton_l" << endl; } }; // 新增:类外定义静态成员变量并初始化 singleton_l* singleton_l::Instance = nullptr; int main() { singleton_l * s1; // 修改:通过类名调用静态成员函数,将返回的实例地址赋值给s1 s1 = singleton_l::GetInstance(); s1->show(); return 0; }
额外注意事项
你当前实现的懒汉单例不是线程安全的,多线程场景下同时调用GetInstance可能会创建多个实例,需要额外加锁处理。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

