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
相关产品推荐
相关产品推荐

