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

C++中如何通过引用传递对象指针以避免对象拷贝?

关于指针引用传递的问题分析与修正

嘿,我看了你的代码,你想通过指针引用传递来避免对象拷贝、直接访问内容的思路完全没问题,但咱们来理清楚这里的细节和可能遇到的坑:

先拆解你的当前代码

函数定义

int encode_frame(vpx_codec_ctx_t *codec, vpx_image_t *img, int frame_index, int flags, VpxVideoWriter *writer, const vpx_codec_cx_pkt_t *&pkt ) {
    // 函数内部逻辑
}

这里的const vpx_codec_cx_pkt_t *&pkt是指向const vpx_codec_cx_pkt_t的指针的引用,意思是函数可以直接修改外部传入的pkt指针的指向,而且完全不会涉及对象拷贝——这正是你想要的效果。

调用代码

const vpx_codec_cx_pkt_t *pkt = NULL; 
encode_frame(&codec, &raw, frame_count++, 0, writer, pkt);

从语法上来说这段代码是合法的,但如果你发现函数内部对pkt的修改没有同步到外部,或者遇到了编译错误,可能是你对指针引用的用法有点混淆,下面给你两种更清晰的实现方式:

两种正确的实现方案

方案一:沿用指针引用的思路(保持你的初衷)

只要在函数内部正确修改指针指向,外部的pkt就会同步更新,比如函数内部可以这么写:

int encode_frame(vpx_codec_ctx_t *codec, vpx_image_t *img, int frame_index, int flags, VpxVideoWriter *writer, const vpx_codec_cx_pkt_t *&pkt ) {
    // 假设这里从编码器获取到了编码后的packet
    const vpx_codec_cx_pkt_t *new_packet = vpx_codec_get_cx_pkt(codec, frame_index);
    pkt = new_packet; // 这里的修改会直接同步到外部的pkt变量
    // 其他编码逻辑...
    return 0;
}

调用的时候保持你原来的写法就行,因为pkt是一个左值,符合指针引用的参数要求。

方案二:改用指针的指针(更贴近C风格的常见写法)

如果觉得指针引用有点绕,也可以用指针的指针来实现同样的效果,函数定义改成:

int encode_frame(vpx_codec_ctx_t *codec, vpx_image_t *img, int frame_index, int flags, VpxVideoWriter *writer, const vpx_codec_cx_pkt_t **pkt ) {
    // 内部修改指针指向
    const vpx_codec_cx_pkt_t *new_packet = vpx_codec_get_cx_pkt(codec, frame_index);
    *pkt = new_packet; // 解引用指针的指针,修改外部指针的指向
    // 其他编码逻辑...
    return 0;
}

对应的调用方式需要传递指针的地址:

const vpx_codec_cx_pkt_t *pkt = NULL; 
encode_frame(&codec, &raw, frame_count++, 0, writer, &pkt);

重要提醒

不管用哪种方式,你都是在传递指针的"引用"或"指针",本质都是让函数能修改外部指针的指向,从而直接访问原对象内容,完全不会触发对象拷贝,这完全符合你的需求。另外要注意:确保函数内部获取到的vpx_codec_cx_pkt_t对象生命周期足够长,别等外部用pkt的时候,对象已经被释放了哦。

内容的提问来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:29:56