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

相关推荐
CoderYanger5 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
估值探索者5 小时前
【Python量化选股流水线 #04】选股器好不好用?「昨日候选→今日表现」回看验收
开发语言·python·股票数据·股票数据api接口
爱喝热水的呀哈喽6 小时前
HEJIAN RESEARCH
开发语言·matlab
白露与泡影6 小时前
后端 Java 面试核心八股汇总|高频面试题 + 解析,覆盖基础到进阶
java·开发语言·面试
xifangge20257 小时前
基于 JavaScript 实现 CNC 数控切削参数与螺纹公差纯前端核算引擎
开发语言·前端·javascript
“AI国潮设计-小江”7 小时前
【AIGC实战】Python+SDXL批量生成「潮汕英歌舞冰淇淋蛋糕&红桃粿咖啡」IP,固定角色形象批量出甜品商业效果图
开发语言·人工智能·python·prompt·aigc
\光辉岁月/7 小时前
3.包装类
java·开发语言·包装类
FRing038 小时前
JavaScript入门到精通二十四(正则表达式、元字符、修饰符)
开发语言·前端·javascript·正则表达式
西索斯coding8 小时前
Grok 4.7 调用一直 401 怎么办?不是 Key 过期,是 Authorization 头格式问题——排查全流程 + 修复示例
服务器·开发语言·ai·php
SEO_juper9 小时前
hreflang 审计工具:外贸多语言站谷歌SEO的隐性杀手
开发语言·人工智能·爬虫·python·seo