C++指针离开作用域后失效问题求助
问题根源与修复方案
嘿,这问题我太熟了——你踩了C++里值返回 vs 引用返回的经典坑!
问题出在哪?
看你的B类定义:X getX(); 这个函数返回的是xInfo的临时副本,不是原对象里的xInfo本身。
当你执行这些代码时:
cout << "Address one: " << &bObj.getX().pointerToAType; bObj.getX().setPointer(&bObj); cout << "Address four: " << &bObj.getX().pointerToAType;
每一次调用bObj.getX()都会创建一个全新的X临时对象,你对这个临时对象的pointerToAType做的任何修改,在语句执行完之后就跟着临时对象一起销毁了,根本碰不到bObj里真正的xInfo成员。这就是为什么你觉得指针“离开作用域后无法保持”——因为你从始至终都没修改过真正要改的对象!
怎么修复?
把getX()的返回类型改成引用,让它直接返回bObj里的xInfo:
- 修改B类的声明:
class B: public A{ // ... X xInfo; X& getX(); // 改成返回引用 // 如果需要只读访问,再加个const版本: const X& getX() const; };
- 实现getX函数时返回引用:
X& B::getX() { return xInfo; // 返回成员本身,不是拷贝 } // const版本实现(可选) const X& B::getX() const { return xInfo; }
这样再执行你的代码,bObj.getX()就会直接操作bObj内部的xInfo对象,修改的pointerToAType自然就能持久化了,打印的地址也会和预期一致。
额外提醒
如果不小心返回了局部变量的引用,那会出大问题,但这里你返回的是类的成员变量,生命周期和B对象一致,完全安全。
内容的提问来源于stack exchange,提问作者Dave Lass
相关产品推荐
相关产品推荐

