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

只能在栈上创建对象


🧱 一、类整体设计目标

我们想要实现:

只能在栈上创建对象,禁止在堆上 new 出来。

例如:

StackOnly obj;      // ✅ OK:在栈上创建
StackOnly* p = new StackOnly();  // ❌ 编译错误:禁止 new

🚦 二、类的结构拆解

🔹 构造函数与析构函数

StackOnly() {std::cout << "构造 StackOnly" << std::endl;
}~StackOnly() {std::cout << "析构 StackOnly" << std::endl;
}
  • 正常的构造和析构,用来观察创建/销毁过程。
  • 由于我们只允许栈上创建,析构函数可以是 public 的

🔹 成员函数

void print() {std::cout << "我是只能在栈上创建的对象" << std::endl;
}

普通成员函数,没特别之处。


🔹 禁止复制操作(可选但推荐)

StackOnly(const StackOnly&) = delete;
StackOnly& operator=(const StackOnly&) = delete;
❓ 为什么推荐禁用?

因为即使你禁止了 new,如果没禁用复制,有人可以写:

StackOnly obj1;
StackOnly* p = new StackOnly(obj1);  // ❌ 还是绕过你了

所以把复制构造和赋值操作都 = delete 是安全做法,防止被“曲线救国”。


🔹 核心点:禁用堆分配

void* operator new(size_t) = delete;
void operator delete(void*) = delete;
✅ 这是关键操作!
  • operator new 是在使用 new 时会被调用的函数;
  • operator delete 是在使用 delete 时调用的函数;

你把它们 = delete,编译器在编译期就会报错,强制禁止堆上创建对象


💡 你可以试着写一组测试代码:

int main() {StackOnly obj;     // ✅ OKobj.print();StackOnly* p = new StackOnly();  // ❌ error: use of deleted functiondelete p;                        // ❌ error: use of deleted function
}

运行结果:

构造 StackOnly
我是只能在栈上创建的对象
析构 StackOnly

✅ 总结

目的方法
禁止堆上创建operator new/delete = delete;
禁止对象复制拷贝构造 / 赋值操作 = delete
保留正常栈上使用能力构造函数/析构函数保持 public

📌 延伸:如果你想做“只能在堆上创建”的类呢?

那就相反处理:

  • 构造函数设为 private
  • 提供 static create()
  • 析构函数私有 + friend(防止用户 delete);
http://www.dtcms.com/a/294354.html

相关文章:

  • Linux网络-------1.socket编程基础---(UDP-socket)
  • 广州邮科万兆6光千兆48电工业级光纤交换机:三层功能如何重新定义网络智能化
  • Vue Scoped样式:当动态元素成为“无家可归“的孤儿
  • 2025年云南燃气经营企业从业人员考试题
  • Axios封装以及添加拦截器
  • UniApp X 网络请求避坑指南:从 JS 到 UTS 的 JSON 数据处理全解析
  • MCU驱动AD5231BRUZ_10K
  • GoLang学习笔记
  • Qt 菜单与工具栏设计:提升用户体验
  • stm32使用USB虚拟串口,因电脑缺少官方驱动而识别失败(全系列32单片机可用)
  • Git下载全攻略
  • 状压Dp和记忆化搜索
  • k8s怎么找deploy历史版本?
  • UDP通信是否需要使用bind,connect,send等函数
  • 如何高效合并音视频文件
  • iview+Tree 在数据中添加selected和expand属性默认展开后点不动问题
  • 【数据结构】——时间与空间复杂度深度解析
  • MATLAB近红外光谱分析:MATLAB编程+BP神经网络+SVM+随机森林+遗传算法+变量降维+卷积神经网络等
  • 云蝠智能 Voice Agent:重构企业语音交互,引领 AI 服务新范式
  • 《Spring Bean生命周期全景图解:从实例化到销毁》
  • 增强LLM最后隐藏层的意义与效果
  • 文本溢出时显示省略号,并在鼠标移入文本时显示 tooltip全内容
  • Taint Bug (污点漏洞):
  • 【bug】websocket协议不兼容导致的一个奇怪问题
  • 垃圾回收介绍
  • jenkins 入门指南:从安装到启动的完整教程
  • Selenium是解决了什么问题的技术?
  • web安全 | docker复杂环境下的内网打点
  • Docker 启动 PostgreSQL 主从架构:实现数据同步的高效部署指南
  • VRRP的概念及应用场景