应消除 delete 和 new 等魔术关键字,改用 raii、智能指针、工厂模式、constexpr 初始化等机制实现确定性内存管理与编译期类型安全。

消除 delete 和 new 这类“魔术关键字”,本质是减少手动内存管理与隐式对象生命周期控制,这对通用 SDK 和底层框架尤其关键——它们被广泛复用,任何隐式行为都可能在下游引发难以追踪的资源泄漏、析构顺序错误或跨平台兼容问题。可维护性提升主要体现在确定性、可测试性与静态可分析性上。
用 RAII 或托管生命周期替代 raw new/delete
在 C++ SDK 中,优先使用智能指针和作用域容器:
-
替换裸 new: 用
std::make_unique<t>()</t>或std::make_shared<t>()</t>替代new T,确保构造与所有权绑定,避免裸指针逸出 -
替换裸 delete: 完全不写
delete;若需显式释放(如自定义内存池),封装为allocator::deallocate()并通过 RAII wrapper(如scoped_allocator)管理 -
数组场景: 用
std::vector<t></t>或std::array<t n></t>替代new T[n],避免delete[]配对错误
用工厂模式 + 不可变构造替代运行时 new
SDK 接口应暴露工厂函数而非构造函数,把对象创建逻辑集中管控:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 定义
static std::unique_ptr<codec> CreateCodec(CodecType type)</codec>,内部根据类型分支返回预注册的实现,而非让用户调用new H264Codec() - 构造参数强制通过结构体传入(如
CodecConfig{.bitrate = 2000, .gop = 30}),避免new调用中散落魔法数字 - 所有工厂返回值统一为 move-only 类型(
unique_ptr或值类型),杜绝裸指针传递
用模板元编程替代反射式 new
避免通过字符串或枚举动态 new 类型(如 if (name == "json") return new JsonSerializer;):
- 用
std::variant<jsonserializer xmlserializer></jsonserializer>+ 访问者模式,在编译期确定类型组合 - 对扩展点,提供
template<typename t> void RegisterSerializer();</typename>注册机制,类型信息全程保留在模板参数中,无需运行时字符串匹配 - 若必须支持插件式加载,用符号表 + 工厂函数指针(
extern "C" CreatorFn get_serializer_factory();),而非dlsym后reinterpret_cast成new函数指针
用 constexpr 初始化替代运行时 new
对配置类、策略单例等只读对象,尽可能移至编译期:
- 将
static Config* g_config = new Config(...);改为inline constexpr Config g_config{.timeout_ms = 5000}; - 使用
std::span<const uint8_t></const>替代uint8_t*+ size 参数,避免用户误用new uint8_t[...] - 对需要延迟初始化的全局状态,用
std::optional<threadpool></threadpool>+std::call_once,而非static ThreadPool* s_pool = nullptr;+ 手动new










