C++类内部同类型指针成员创建后访问为空的问题如何解决
问题核心原因
- 你的Point类构造函数没有初始化
child指针,新创建的Point实例中child是野指针,只要你没有提前调用createChild()就调用getChild(),解引用野指针就会直接触发访问位置读取违规异常。 - 如果你的业务逻辑允许不存在子对象的场景,直接解引用可能为野指针/空指针的
child本身就是非法操作。 - 你当前的
getChild()是值返回,返回的是*child的拷贝,如果你期望拿到原child对象的引用进行修改,值返回的方案本身就不符合需求,你修改的只是副本不会同步到原对象,看起来就像指针"变回空值"。
修复方案
基础修复(解决崩溃问题)
- 构造函数初始化
child为nullptr,避免野指针 getChild()增加空指针判断,你可以根据业务需求选择空指针时抛异常、返回默认对象,或者修改返回值为指针类型返回空- 调用
getChild()前必须保证已经执行过createChild()创建子对象
可选优化
如果你需要获取原child对象的引用而非拷贝,可以修改getChild()的返回值为引用类型;同时建议补充析构函数释放child的内存,避免内存泄漏,必要时补充拷贝构造、拷贝赋值运算符重载,遵守C++三五原则,避免浅拷贝导致的双重释放问题。
修正后代码示例
#include <stdexcept> class Point { private: double x; double y; Point *child = nullptr; // C++11及以上支持类内初始化,也可以放到构造函数初始化列表 public: Point(double a, double b) : x(a), y(b) {} // 返回可修改的子对象引用 Point& getChild() { if (!child) { // 这里可以根据你的业务需求调整空指针处理逻辑 throw std::runtime_error("子对象未创建,请先调用createChild()"); } return *child; } // 只读场景的const版本 const Point& getChild() const { if (!child) { throw std::runtime_error("子对象未创建,请先调用createChild()"); } return *child; } void createChild(double a, double b) { // 多次调用时先释放原有子对象,避免内存泄漏 delete child; child = new Point(a, b); } // 析构函数释放子对象内存 ~Point() { delete child; } // 拷贝构造函数,避免浅拷贝问题 Point(const Point& other) : x(other.x), y(other.y) { if (other.child) { child = new Point(*other.child); } } // 拷贝赋值运算符重载 Point& operator=(const Point& other) { if (this == &other) return *this; delete child; child = nullptr; x = other.x; y = other.y; if (other.child) { child = new Point(*other.child); } return *this; } };
调用注意事项
- 必须先调用
createChild()再调用getChild(),否则会触发你定义的空指针处理逻辑 - 如果需要提前释放子对象,可以手动补充
releaseChild()类接口手动清空指针
内容的提问来源于stack exchange,提问作者Jaehyeon Kim
相关产品推荐
相关产品推荐

