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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:59:09