在单例类头文件dbg_log_handler.h里面声明静态变量 m_dbg_Instance,在对应cpp dbg_log_handler.cpp里面定义这个静态变量 m_dbg_Instance.当我在全局函数调用这个单例类时,我发现每调用一次就构造一次.当我把这个静态变量的定义放在这个全局函数所在的cpp dbg_common.cpp里面时,则只构造一次,没有想明白为何会是这样子.
dbg_log_handler.h
class DbgLogHandler final{
static DbgLogHandler& Instance() {
return m_dbg_Instance;
}
static DbgLogHandler m_dbg_Instance;
};
dbg_log_handler.cpp
DbgLogHandler DbgLogHandler ::m_dbg_Instance;
DbgLogHandler::DbgLogHandler()
: {
}
dbg_common.cpp
/m_dbg_Instance定义在这就构造一次,放在dbg_log_handler.cpp里面每调用一次info_log的接口就会构造一次这个单例,很奇怪/
int info_log(const char* format) {
DbgLogHandler& dbg = DbgLogHandler::Instance();
}
不知道你是否有将构造函数、copy操作都设为private?
只看你这一段代码并不能看出问题,如果可以,建议发出工程demo + 运行环境。我用的Win10x64 + VS 2022 就没问题,不会多次初始化单例模式。
我比较怀疑是代码其他部分发生了构造、或者拷贝构造。
或者你在你的PC上运行以下我改写的下面这段代码,将实例化延迟到第一次调用instance时,而不是程序启动时(进入main前)。
看看调用info_log()
还会不会导致单例模式多次初始化:
// dbg_log_handler.h
#pragma once
#include <iostream>
using namespace std;
class DbgLogHandler final {
public:
static DbgLogHandler& Instance() {
static DbgLogHandler m_dbg_Instance;
return m_dbg_Instance;
}
private:
DbgLogHandler()
{ // definition for Debug
cout << "construct DbgLogHandler" << endl;
}
DbgLogHandler(const DbgLogHandler&) = default;
DbgLogHandler& operator=(const DbgLogHandler&) = default;
~DbgLogHandler() = default;
};
// dbg_common.h
#pragma once
int info_log(const char* format);
// dbg_common.cpp
#include "dbg_log_handler.h"
#include <iostream>
using namespace std;
int info_log(const char* format) {
cout << "info_log" << endl;
DbgLogHandler& dbg = DbgLogHandler::Instance();
return 0;
}
// test.cpp
#include "dbg_log_handler.h"
#include "dbg_common.h"
#include <iostream>
using namespace std;
int main()
{
cout << "enter main" << endl;
//DbgLogHandler obj1 = DbgLogHandler::Instance();
//DbgLogHandler obj2 = DbgLogHandler::Instance();
info_log("A");
info_log("B");
return 0;
}
可以的
代码写的不太规范,构造函数未声明就实现,后面描述也没说清什么时候单例什么时候多次构造。
好像是可以的。
完全可以,头文件所有定义都是全局的