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
相关产品推荐
相关产品推荐

