问题:静态库中实现的单例,一个动态库link了该静态库,另一个执行程序同时link了前面的静态库和动态库,会出现什么问题
测试环境:window
// lib .h
#pragma once
class libx_a
{
private:
int _a;
public:
int get_a()
{
return _a;
}
void set_a(int a)
{
_a = a;
}
};
extern libx_a& get_libx_a();
// lib .cpp
#include "libx.h"
libx_a& get_libx_a()
{
static libx_a inst;
return inst;
}
// dll .h
#pragma once
class __declspec(dllexport) dll_b
{
public:
int get_b();
void set_b(int b);
};
extern __declspec(dllexport) dll_b& get_dll_b();
// dll .cpp
#include "dllx.h"
#include "libx.h"
dll_b& get_dll_b()
{
static dll_b inst;
return inst;
}
int dll_b::get_b()
{
return get_libx_a().get_a();
}
void dll_b::set_b(int b)
{
get_libx_a().set_a(b);
}
// exe .cpp
#include "libx.h"
#include "dllx.h"
int main()
{
get_dll_b().set_b(2);
int lib_a_x = get_libx_a().get_a();
}
// 结果并没有set_b设置到get_libx_a单例的数据里
// lib库会有一个地址在exe里,比如0x00000008, 同时也有一个地址在dll里,比如0x00000007
// dll在被载入到exe时地址是,比如0x00000020, dll里使用的lib单例真正的地址是0x00000027
// 尽量避免在静态库中实现单例
静态库单例问题
最新推荐文章于 2024-08-05 22:20:40 发布