静态库单例问题

问题:静态库中实现的单例,一个动态库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
// 尽量避免在静态库中实现单例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值