C++私有构造函数实现单例类时实例value值不一致问题排查
问题核心原因
你的单例本身逻辑是对的,问题出在实例接收的写法上:
SortOfSingleton::getInstance()返回的是SortOfSingleton&引用类型,但使用auto直接接收返回值时,auto的默认类型推导会丢弃引用修饰符,最终instance1、instance2的类型都是独立的SortOfSingleton对象,不是指向静态单例的引用。- 代码会调用编译器自动生成的默认拷贝构造函数,把全局唯一的静态单例拷贝出一份新的栈上对象,你修改
instance1.value改的是这个拷贝对象的值,完全没有影响到原静态单例的value属性,所以第二次获取的原单例value还是初始值5。
修复方案
快速修复
直接把实例接收的部分改成引用接收即可,auto显式加&修饰:
auto& instance1 = SortOfSingleton::getInstance(); instance1.value = 100; std::cout << instance1.value << std::endl; auto& instance2 = SortOfSingleton::getInstance(); std::cout << instance2.value << std::endl;
更规范的单例实现
为了从根源避免不小心触发拷贝的问题,建议在单例类中显式删除拷贝构造和拷贝赋值函数,写错的时候编译器会直接报错提示:
class SortOfSingleton { public: static SortOfSingleton& getInstance(); int value = 0; // 显式删除拷贝构造和拷贝赋值 SortOfSingleton(const SortOfSingleton&) = delete; SortOfSingleton& operator=(const SortOfSingleton&) = delete; private: SortOfSingleton(int value); };
另外补充:C++标准规定main函数的返回值必须是int,void main是非标准写法,建议改成int main()。
内容的提问来源于stack exchange,提问作者Damn Vegetables
相关产品推荐
相关产品推荐

