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

C++类指针成员调用时变为nullptr或无法读取内存如何修复?

问题原因

你代码的核心问题是Login类的GameManager* manager成员指针从未被初始化,指向无效内存地址,直接解引用调用成员函数自然会触发「无法读取内存」的空指针错误,和你之前做的前向声明没有关系,前向声明的用法是正确的。
C++中的原始指针声明后不会自动指向有效内存,默认是野指针/空值,必须手动赋值为合法的实例地址后才能解引用使用。

修复方案

你可以通过给Login添加构造函数完成指针初始化,以下是修改后的参考代码:

1. 修改Login.h

添加构造、析构函数,同时给指针设置默认空值避免野指针:

#pragma once
#include <iostream>
using namespace std;
class GameManager;
class Login {
public:
    // 构造函数支持传入外部GameManager实例,不传则默认内部创建
    Login(GameManager* externalMgr = nullptr);
    // 析构函数释放资源
    ~Login();
    void StartMenu();
private:
    GameManager* manager = nullptr;
};

2. 修改Login.cpp

实现构造、析构逻辑,调用成员函数前增加判空保护:

#include "Login.h"
#include "GameManager.h"
Login::Login(GameManager* externalMgr) {
    if (externalMgr != nullptr) {
        manager = externalMgr;
    } else {
        // 内部创建GameManager实例
        manager = new GameManager();
    }
}
Login::~Login() {
    // 如果是外部传入的实例不要在此处delete,避免重复释放
    delete manager;
    manager = nullptr;
}
void Login::StartMenu() {
    // 调用前判空,避免空指针访问
    if (manager != nullptr) {
        manager->GameStart();
    }
}

补充说明

  • 如果你的GameManager是全局共用的单例类,可以直接在StartMenu中获取单例指针赋值给manager,不需要Login自己创建实例
  • 后续涉及指针操作时,都建议先做判空校验再使用,避免同类内存访问问题

内容的提问来源于stack exchange,提问作者IStrayDogI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:36:08