用 C++ 编写的单例模式中的一些错误

Posted

技术标签:

【中文标题】用 C++ 编写的单例模式中的一些错误【英文标题】:Some bugs in singleton mode written in C++ 【发布时间】:2020-12-15 14:36:23 【问题描述】:
#ifndef CONFIG_CPP
#define CONFIG_CPP
#include <mutex>
using namespace std;
class Config 
 public:
  static Config* GetDefult()
    if (p_instance == nullptr)
      mutex_.lock();
      if (p_instance == nullptr)
        p_instance = new Config();
      
      mutex_.unlock();
    
    return p_instance;
  
 private:
  static Config* p_instance;
  static mutex mutex_;
  Config();
;
int main()
  auto t1 = Config::GetDefult();

#endif //CONFIG_CPP

这些消息在我跑步时出现

/tmp/ccKc2m2t.o:在函数Config::GetDefult()': Config.cpp:(.text._ZN6Config9GetDefultEv[_ZN6Config9GetDefultEv]+0xc): undefined reference to Config::p_instance' Config.cpp:(.text._ZN6Config9GetDefultEv[_ZN6Config9GetDefultEv]+0x16): 未定义引用Config::mutex_' Config.cpp:(.text._ZN6Config9GetDefultEv[_ZN6Config9GetDefultEv]+0x22): undefined reference to Config::p_instance' Config.cpp:(.text._ZN6Config9GetDefultEv[ZN6Config9GetDefultEv]+0x43): 未定义引用Config::p_instance' Config.cpp:(.text._ZN6Config9GetDefultEv[_ZN6Config9GetDefultEv]+0x48): undefined reference to Config::mutex' Config.cpp:(.text._ZN6Config9GetDefultEv[_ZN6Config9GetDefultEv]+0x54): 未定义对 `Config::p_instance' 的引用 collect2:错误:ld 返回 1 个退出状态

【问题讨论】:

你把Config* Config::p_instance;放到cpp文件里了吗?为什么要包含警卫? 这能回答你的问题吗? Undefined reference to static variable c++ 好的,非常感谢。 【参考方案1】:

静态数据成员必须在源文件中的类声明之外进行初始化。它们具有全局范围,通常将多线程代码与静态代码混合不是一个好主意。

class Config 
...
;

Config* Config::p_instance = nullptr;

【讨论】:

以上是关于用 C++ 编写的单例模式中的一些错误的主要内容,如果未能解决你的问题,请参考以下文章

C++中的单例模式

c++单例模式为啥不在析构函数中释放静态的单例对象,而要加一个内嵌类

C++的单例模式的几种实现方式解析

Python中的单例模式与反弹机制

C++的单例模式与线程安全单例模式(懒汉/饿汉)

C++ 线程安全的单例模式总结