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

C++类内部同类型指针成员创建后访问为空的问题如何解决

问题核心原因
  • 你的Point类构造函数没有初始化child指针,新创建的Point实例中child是野指针,只要你没有提前调用createChild()就调用getChild(),解引用野指针就会直接触发访问位置读取违规异常。
  • 如果你的业务逻辑允许不存在子对象的场景,直接解引用可能为野指针/空指针的child本身就是非法操作。
  • 你当前的getChild()是值返回,返回的是*child的拷贝,如果你期望拿到原child对象的引用进行修改,值返回的方案本身就不符合需求,你修改的只是副本不会同步到原对象,看起来就像指针"变回空值"。
修复方案

基础修复(解决崩溃问题)

  1. 构造函数初始化child为nullptr,避免野指针
  2. getChild()增加空指针判断,你可以根据业务需求选择空指针时抛异常、返回默认对象,或者修改返回值为指针类型返回空
  3. 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:54:04