You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:57:03