C++是否有标准库指针包装器可追踪raw pointer是否已被delete
现有场景下的标准库替代方案
你当前对接的API会明确通过返回值告知是否已删除入参指针,完全不需要自定义复杂的Holder类,用C++标准库的std::unique_ptr就可以实现需求,代码更简洁且无额外依赖:
方案1:直接显式处理(逻辑最透明)
利用std::unique_ptr的独占所有权特性,配合release()方法放弃所有权即可避免重复释放:
#include <memory> // 调用示例 std::unique_ptr<Thing> ptr = std::make_unique<Thing>(); bool res = foo(ptr.get()); if (res) { // 第三方API已经delete了指针,让unique_ptr放弃所有权即可 ptr.release(); } // 作用域结束后,如果没有调用release,unique_ptr会自动执行delete操作
该方案不需要依赖T的析构为虚函数,也不需要子类化T,适用范围更广。
方案2:封装通用工具(消除重复代码)
如果不想每次调用都重复写判断逻辑,可以封装一个通用的全局调用函数,一次编写到处复用:
#include <memory> #include <utility> template<typename T, typename ApiFunc> decltype(auto) call_conditional_delete_api(ApiFunc&& api, std::unique_ptr<T> ptr) { auto ret = api(ptr.get()); if constexpr (std::is_same_v<decltype(ret), bool>) { // API返回true表示已删除指针,释放unique_ptr所有权 if (ret) ptr.release(); } return ret; }
使用时不需要关心内存清理逻辑,一行即可完成调用:
bool res = call_conditional_delete_api(foo, std::make_unique<Thing>()); // 后续直接写测试逻辑即可
补充说明
C++标准库没有和你实现的Holder完全对等的内置组件,你的Holder本质是为了适配不返回是否释放指针状态的API,通过子类化带虚析构的T来追踪释放状态的特殊实现。如果后续遇到这类不返回状态的第三方API,你的自定义实现就是合理的解决方案。
内容的提问来源于stack exchange,提问作者Adam Kotwasinski
相关产品推荐
相关产品推荐

