为何返回左引用后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
相关产品推荐
相关产品推荐

