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

为何返回左引用后hookFunc与Ctx::hookFunc4Boost地址仍不同?

Why are the addresses of hookFunc and Ctx::hookFunc4Boost different when returning a reference?

我原本想通过返回Ctx::hookFunc4Boost的左值引用来避免临时对象拷贝,但运行后发现hookFunc和Ctx::hookFunc4Boost的地址不一样,想问问这是为什么?

代码片段

#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <iostream>
class Ctx {
public:
    const boost::function<void((void*))>& getBoostHookFun(void) {
        std::cout << "inner hookFunc4Boost:" << (void*)(&hookFunc4Boost) << std::endl;
        return hookFunc4Boost;
    }
private:
    boost::function<void(void*)> hookFunc4Boost;
};
int main() {
    Ctx ctx;
    Ctx *pCtx = &ctx;
    const boost::function<void((void*))> hookFunc = pCtx->getBoostHookFun();
    std::cout << "outer hookFunc:" << (void*)(&hookFunc) << std::endl;
}

输出结果

inner hookFunc4Boost:0x7fffffffdf28
outer hookFunc:0x7fffffffd540

嗨,这个问题的核心在于你声明hookFunc的方式——你把它声明成了一个const boost::function<void(void*)>类型的独立对象,而不是引用类型!

让我们一步步拆解:

  • 你的getBoostHookFun()方法确实返回的是hookFunc4Boost的左值引用,这部分是没问题的。
  • 但在main函数里,你写的是:
    const boost::function<void((void*))> hookFunc = pCtx->getBoostHookFun();
    
    这里的hookFunc是一个全新的对象,它会通过拷贝构造,把引用指向的hookFunc4Boost的内容复制过来初始化自己。既然是两个不同的实例,它们的内存地址自然不一样。

要实现你想要的“避免拷贝、共享同一个对象”的效果,只需要把hookFunc声明成引用类型即可,这样它就只是原对象的一个别名:

const boost::function<void(void*)>& hookFunc = pCtx->getBoostHookFun();

修改后再运行程序,你会看到两个输出的地址完全相同,同时也避免了不必要的拷贝操作,完美达到你的初衷。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:28:17