当前位置: 首页 > news >正文

11.什么是单例模式?

11.什么是单例模式?

1.确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。

2.什么时候使用单例
  核心思想:系统只需要1个实例,如日志打印,

3.在单例模式下,怎么防止在堆上创建多个对象?
回答模板:

  1. 构造函数私有化:阻止外部直接 new 对象

  2. 禁用拷贝和移动构造:防止通过已有对象复制

  3. 删除 operator new:阻止通过 new 表达式在堆上分配

  4. 删除 placement new:防止在已有内存上重新构造

防御措施 防止的操作 代码实现
私有构造函数 new Singleton() private: Singleton(){}
delete 拷贝构造 Singleton s2 = s1 Singleton(const Singleton&)=delete
delete operator new new Singleton() void* operator new(std::size_t)=delete
delete placement new new(buffer) Singleton() void* operator new(std::size_t, void*)=delete


  1.私有化构造函数

class Singleton {
private:// 私有构造函数 - 阻止外部直接 newSingleton() {}// 禁止拷贝和赋值Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;public:static Singleton& getInstance() {static Singleton instance;return instance;}
};// ❌ 以下都无法通过编译
Singleton* s1 = new Singleton();     // 错误:构造函数是私有的
Singleton s2;                        // 错误:构造函数是私有的
Singleton s3 = *s1;                  // 错误:拷贝构造函数被删除

以上属于普通防御,但这还不够! 面试官可能追问:"如果用户用 placement new 在已有内存上构造呢?"

// 重载 placement new,但标记为删除static void* operator new(std::size_t size) = delete;static void* operator new(std::size_t size, void* ptr) = delete;

 简述完整防止在堆上创建多个对象的方案?

class Singleton {
private:// 1. 私有化构造函数和析构函数Singleton() { std::cout << "Singleton created" << std::endl;}~Singleton() {std::cout << "Singleton destroyed" << std::endl;}// 2. 禁止拷贝和移动Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;Singleton(Singleton&&) = delete;Singleton& operator=(Singleton&&) = delete;// 3. 禁止在堆上分配 - 重载 operator newstatic void* operator new(std::size_t size) = delete;static void operator delete(void* ptr) = delete;// 4. 禁止 placement newstatic void* operator new(std::size_t size, void* ptr) = delete;public:// 唯一获取实例的方法static Singleton& getInstance() {static Singleton instance;return instance;}// 如果需要,提供一个方法来安全销毁(通常不需要)static void destroy() {// 注意:不能直接 delete this// Meyers Singleton 会在程序结束时自动析构}void doSomething() {std::cout << "Doing something at address: " << this << std::endl;}
};// 测试
int main() {// ✅ 正确用法Singleton& s1 = Singleton::getInstance();Singleton& s2 = Singleton::getInstance();s1.doSomething();// ❌ 以下所有操作都无法编译// Singleton s3;                           // 构造函数私有// Singleton* s4 = new Singleton();        // operator new 被删除// Singleton s5 = s1;                      // 拷贝构造被删除// Singleton* s6 = new(&s1) Singleton();   // placement new 被删除std::cout << "Same instance? " << (&s1 == &s2) << std::endl;  // truereturn 0;
}

 最后可能会问,如果用户malloc分配内存然后强制转换呢?

// 理论上可以绕过,但会导致未定义行为
void* mem = malloc(sizeof(Singleton));
Singleton* evil = reinterpret_cast<Singleton*>(mem);  // ❌ 危险!
// 构造函数没有被调用,对象状态无效

无法完全防止恶意绕过,但这不是常规用法,C++ 的类型系统已经足够安全。如果真的需要防止,可以在构造函数中检查是否已有实例:

http://www.jsqmd.com/news/980092/

相关文章:

  • 岳阳市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • 南充黄金回收哪家靠谱 本地靠谱实体门店汇总 - 润富黄金回收
  • 嘉兴SEO优化公司|ToB企业询盘提升,嘉兴SEO营销公司服务对比 - 招财兔数字员工
  • Web 编程核心思路 + 实用技巧(全栈通用)
  • 3分钟生成专业短视频:Pixelle-Video AI全自动视频创作工具完全指南
  • 2026工控机应用白皮书网络安全领域深度剖析:嵌入式工控机/工业平板电脑/工业计算机厂家/全国产化主板/国产化电脑定制/选择指南 - 优质品牌商家
  • 别再只盯着PHY芯片了!手把手教你搞定RGMII接口PCB布局布线(含TI TDA4/高通8295 SoC直连避坑指南)
  • 别再只用uvm_do_on了!手把手教你用start_item/finish_item搞定复杂transaction发送
  • STM32 HAL库ADC采样总是不准?可能是DMA配置踩了这些坑(以F103C8T6为例)
  • GPT-5.5 Instant实测:10分钟就能把读过的文献转化成学术论证!
  • ML工程师的CI/CD实战指南:构建可验证、可回滚的模型交付流水线
  • Spring WebFlux + AI 流式输出深度解析:Spring AI 与 LangChain4j 效果差异溯源
  • 云浮市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • 株洲市黄金回收本地靠谱店铺指南+白银回收+铂金回收+彩金回推荐收门店 及地联系方式址推荐 - 盛世金银回收
  • 越南服务器 ping 值多少?
  • 多维聚合数据操作:预计算、实时补丁与语义层三层架构
  • Python List底层原理与高性能使用指南
  • 多维聚合实战:从GROUP BY到OLAP立方体的数据操纵体系
  • 智能眼镜禁入之后:高考考场里的“AI巡检员”如何炼成?
  • 本科生毕业设计专用:OpenCV图像处理+CNN车牌字符识别完整实现包
  • 福清SEO优化公司|品牌搜索曝光升级,福清网站优化公司能力解析 - 招财兔数字员工
  • 双歧管拓扑优化针翅冷板:汽车功率逆变器高热通量热管理的破局之道
  • 从PLC到储能系统,工业网络为何越来越重视自主可控?
  • 青岛家政保姆怎么选?老牌机构刘大姐家政深度测评(避坑干货)
  • 驻马店市黄金回收本地靠谱店铺指南+白银回收+铂金回收+彩金回推荐收门店 及地联系方式址推荐 - 盛世金银回收
  • 运城市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • 有人在对话框里写“忽略你的设定“,我的 Agent 差点被带跑——聊聊 Prompt 注入防御
  • 铜川卖黄金选哪家 正规黄金回收门店实测汇总 - 润富黄金回收
  • 实测以Claude code+ChatGPT5.5的思路----万字黑马点评项目完整复盘
  • LangGraph重构RAG:从链式流水线到可编程状态图