c++ 23 std::out_ptr用法

直接测试下,代码如下:

cpp 复制代码
// 模拟C库,malloc分配,free释放
struct MyObj {
    int val;
};

// C风格函数:分配内存,二级指针输出结果。这里只是模拟,真实c库异常时直接返回错误码,没有c++的抛异常语法。
void create_obj(MyObj** out) {
    *out = (MyObj*)malloc(sizeof(MyObj));
    if (*out == nullptr) {
        throw std::runtime_error("malloc fail...");
    }
    (*out)->val = 9527;
    std::cout << "[C库 malloc] 分配MyObj,地址:" << *out << "\n";
}

// C风格释放函数,配套malloc,用free
void free_obj(MyObj* p) {
    if (p) {
        std::cout << "[C库 free] 释放MyObj,地址:" << p << "\n";
        free(p);
    }
}

// 老式写法(可能会有异常安全漏洞)
void old_style_demo()
{
    std::cout << "老式写法\n";
    MyObj* raw = nullptr;
    create_obj(&raw);

    std::cout << "obj val = " << raw->val << "\n";
    // 其他代码。。。
    // 万一这里有异常,不会调用到下面的释放内存。可以加try catch捕获异常,异常时也调用释放,但是业务复杂也可能忘记调用释放。

    free_obj(raw);
    raw = nullptr;
}

// C++23 std::out_ptr 新写法
// create_obj执行完毕,资源立刻被智能指针接管,不管后续正常返回还是抛异常,unique_ptr 析构自动释放,编译器保证执行。
void new_outptr_demo()
{
    std::cout << "C++23 std::out_ptr 写法" << "\n";
    // 自定义删除器:指定释放函数 free_obj
    std::unique_ptr<MyObj, decltype(&free_obj)> up(nullptr, free_obj);

    // out_ptr 自动生成 MyObj** 传给C API
    create_obj(std::out_ptr(up));

    std::cout << "obj val = " << up->val << "\n";
    // 离开作用域,unique_ptr自动调用free_obj释放,无需手动写释放
}

void testOutPtr(void) { // 测试c++23 std::out_ptr
    old_style_demo();
    new_outptr_demo();
}

执行testOutPtr函数:

ok. std::out_ptr + unique_ptr是推荐用法。比手动调用释放内存更智能化,不用担心忘记调用。

相关推荐
陆卿之1 小时前
Java对接DeepSeek
java·开发语言·人工智能
庄园特聘拆椅狂魔1 小时前
Java 后端转全栈的第一课:从前端项目搭建到技术选
java·开发语言·前端
weixin_307779132 小时前
C++代码实现MATLAB中的pade函数功能
开发语言·c++·算法·matlab
ProcessOn官方账号2 小时前
java IO操作 你快速认识IO的相关基本知识
java·开发语言
神仙别闹2 小时前
基于C++实现的(控制台)学校开课查询系统
开发语言·c++
只睡四小时3 小时前
JS 手写 D-pad 空间导航:电视端焦点引擎实战
android·开发语言·前端·javascript·ecmascript·hls·空间导航
2601_962218613 小时前
C++的几种编译器的实现
开发语言·c++
多弗朗皮卡丘3 小时前
C++ stack和queue
开发语言·c++·deque·queue·stack·容器适配器
维克兜率天4 小时前
【维克】弹性策略:用“乖离率“捕捉超跌反弹
android·开发语言·python·深度学习·kotlin·量化