You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:48:00