多个A类实例共享单个B类实例的C++指针使用问题求助
问题分析与解决方案
你的代码确实存在指针处理错误,导致了未定义行为,具体原因和优化方案如下:
问题根源:野指针导致的随机结果
A类构造函数的参数是B b,这是值传递——每次创建A实例时,都会生成obj_b的临时拷贝。构造函数执行完毕后,这个临时拷贝会被销毁,你存在bptr里的地址就变成了无效内存(野指针)。后续通过该指针访问getfoo()时,内存未被覆盖就返回正确值,被覆盖则返回错误值,所以结果时对时错。
优化实现方案
方案1:使用const引用持有B实例(推荐)
既避免拷贝,又通过const限定保证A无法修改B的数据:
#include <iostream> using namespace std; class B{ private: int foo = 9; public: int getfoo() const { return foo; } // 加const,允许const引用调用 }; class A { private: const B& b_ref; // 用const引用持有原B实例 public: A(const B& b) : b_ref(b) {} // 初始化列表初始化引用 int getfoo() { return b_ref.getfoo(); } }; int main () { // 标准C++要求main返回int B obj_b; A A1(obj_b); A A2(obj_b); A A3(obj_b); cout << A1.getfoo() << endl; cout << A2.getfoo() << endl; cout << A3.getfoo() << endl; return 0; }
方案2:使用const指针持有B实例
如果偏好指针写法,直接传递原对象的地址,并通过const限制修改:
#include <iostream> using namespace std; class B{ private: int foo = 9; public: int getfoo() const { return foo; } }; class A { private: const B* b_ptr; public: A(const B* b) : b_ptr(b) {} // 接收原对象地址 int getfoo() { return b_ptr->getfoo(); } }; int main () { B obj_b; A A1(&obj_b); // 传入原对象地址 A A2(&obj_b); A A3(&obj_b); cout << A1.getfoo() << endl; cout << A2.getfoo() << endl; cout << A3.getfoo() << endl; return 0; }
额外注意事项
- 标准C++中
main函数必须返回int,void main属于非标准写法。 - B类的
getfoo函数需加const修饰,确保能被const引用/指针调用。 - 原代码中的
count是笔误,应改为cout。
内容的提问来源于stack exchange,提问作者Robert M.
相关产品推荐
相关产品推荐

