C++类成员指针访问问题求助:为何无法访问vector<A*> vect?
问题分析与修复方案
你的代码出现无法访问vect的核心原因是C类中的B* b指针没有被初始化,是一个野指针。当你在main里创建C对象c时,C的构造函数只是默认构造,没有给b分配有效内存或者指向一个合法的B对象,这时候调用c.func()本质上是通过野指针去访问B的成员函数,属于未定义行为,程序大概率会崩溃或者出现不可预料的结果。
具体错误点拆解
C类的私有成员B* b声明后,默认构造函数C() { }没有对其进行初始化,所以b的值是随机的垃圾地址。- 当调用
c.func()时,执行b->func(),试图通过这个无效的指针访问B的func()方法,虽然func()是成员函数,但这里涉及到隐式的this指针(指向b指向的对象),而this是无效的,进而导致访问vect时出问题。
修复方案(两种常见方式)
方案1:在C的构造函数中动态分配B对象
修改C的构造函数,给b分配内存:
class C { private : B* b ; public : C() { b = new B(); // 动态创建B对象,让b指向有效内存 } // 记得添加析构函数释放内存,避免内存泄漏 ~C() { delete b; } void func (){ b->func(); } };
这样b就指向了一个合法的B对象,调用func()时就能正常访问vect,输出0。
方案2:直接使用B对象而非指针(更简单,避免内存管理问题)
如果不需要动态分配的场景,直接把C里的B* b改成B b,这样默认构造会自动初始化b:
class C { private : B b ; // 直接用对象,不用指针 public : C() { } void func (){ b.func(); } // 调用成员函数用.而不是-> };
这种方式更安全,不需要手动管理内存,也不会出现野指针问题,同样能输出期望的0。
额外建议
在C++中,尽量避免使用裸指针(尤其是未初始化的),如果必须用指针,推荐使用智能指针(比如std::unique_ptr)来自动管理内存,减少内存泄漏和野指针的风险。比如方案1可以改成:
#include <memory> // 包含智能指针头文件 class C { private : std::unique_ptr<B> b ; public : C() : b(std::make_unique<B>()) { } // 初始化智能指针 void func (){ b->func(); } };
这样不需要手动写析构函数,智能指针会在C对象销毁时自动释放B对象的内存。
内容的提问来源于stack exchange,提问作者saturn
相关产品推荐
相关产品推荐

