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是推荐用法。比手动调用释放内存更智能化,不用担心忘记调用。

相关推荐
BaiPeter22 分钟前
ZPL文件预览
开发语言·c++
噢,我明白了5 小时前
JAVA中的一些基础应用知识点
java·开发语言
时间的拾荒人6 小时前
Redis 入门详解:核心特性、重要文件与全局命令实战
开发语言·redis·面试
敲上瘾7 小时前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
码途行者8 小时前
网站的SQL 注入:从攻击原理到防御措施
开发语言·sql·php
旖旎夜光8 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
你看我名字8 小时前
产品参数昨天还对,今天已过期:数眼智能与大模型应用如何做资料版本校验
开发语言·架构
老秦包你会9 小时前
计算机网络第二课 ----Socket(套接字)编程预备
开发语言·计算机网络·php
旖旎夜光9 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
Wang's Blog19 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友