可通过控制 delete 运算符的可见性与可访问性禁止 C++ 类在堆上动态分配对象:一、私有化 operator delete;二、显式 = delete operator delete;三、同时私有/删除 operator new 和 operator delete;四、结合 final 与友元精细化控制。

如果希望某个 C++ 类无法在堆上通过 new 表达式动态分配对象,则可通过控制 delete 运算符的可见性与可访问性来实现。以下是实现该限制的具体方法:
一、将 operator delete 声明为私有
通过将类的 operator delete(包括全局版本和类内重载版本)设为私有,可阻止外部代码调用 delete 释放该类对象,从而间接禁止 new + delete 的完整生命周期使用;编译器在检测到 new 表达式后无法匹配合法的 delete 时,通常会拒绝生成堆分配代码。
1、在类定义内部将 operator delete 声明为 private。
2、同时声明 operator new 为 public 或默认继承,确保构造函数可被调用(若仅禁 delete 而不限制 new,部分编译器仍允许 new,但 delete 会报错)。
立即学习“C++免费学习笔记(深入)”;
3、由于 operator delete 私有,任何对 new 返回指针执行 delete 的尝试都将触发编译错误:error: 'void A::operator delete(void*)' is private within this context。
二、删除 operator delete 并显式 = delete
在 C++11 及以后标准中,可直接使用 = delete 语法显式删除 operator delete 成员函数,使其不可调用且不参与重载解析,比私有声明更明确地表达设计意图。
1、在类中声明 void operator delete(void*) = delete;。
2、同样建议将 operator new 声明为 public,或依赖编译器默认合成(若未自定义)。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
3、当代码中出现 delete 表达式时,编译器立即报错:use of deleted function 'static void A::operator delete(void*)'。
三、仅声明 operator new 为私有并删除 operator delete
此方法进一步强化限制:不仅禁止 delete,还禁止外部调用 new,从而彻底封堵堆分配路径;仅允许类内部(如静态成员函数)可控地完成堆分配。
1、将 operator new 声明为 private 或 protected,并添加 = delete 后缀。
2、同时将 operator delete 显式 = delete。
3、外部代码调用 new 时触发:use of deleted function 'static void* A::operator new(size_t)'。
四、借助 final 类与友元控制 + 删除分配器
结合 final 关键字防止派生类绕过限制,并通过友元机制允许特定管理类调用分配函数,而对外严格封锁;适用于需要封装内存管理逻辑的场景。
1、将类声明为 class A final,避免子类重写或暴露分配函数。
2、声明 operator new 和 operator delete 为 private,并仅授予特定管理类(如 Allocator)友元权限。
3、外部代码因无访问权限而无法调用 new 或 delete,编译时报错提示友元关系缺失或函数不可见。

















