初始化指针时触发写入访问冲突,动态创建数组遇内存地址无效问题
解决动态创建数组时的写入访问冲突问题
看起来你踩了个经典的空指针调用成员变量的坑啊!先给你拆解下问题的核心:错误提示里的Exception thrown: write access violation. this was nullptr已经把原因说得很明白了——你在执行m_Font = new FontType[60];的时候,当前类对象的this指针是空的,导致连成员变量m_Font本身的内存地址都无效,自然没法给它分配数组内存。
问题根源分析
你输出的&m_Font是00000000或00000004这类异常地址,其实是因为:
m_Font作为类的非静态成员变量,它的实际内存地址是this + 成员变量偏移量- 当
this是nullptr时,计算出来的地址就是偏移量本身(比如m_Font在类里的偏移是4字节,地址就是0+4=0x4),这完全是无效内存,写入时必然触发访问冲突。
具体排查与解决步骤
检查调用成员函数的对象是否有效
你肯定是用空指针调用了包含m_Font = new FontType[60];的成员函数,比如:// 错误示例:用空指针调用成员函数 YourClass* ptr = nullptr; ptr->InitFont(); // 此时this就是nullptr改成正确的对象实例化方式:
// 正确示例1:栈上创建对象 YourClass obj; obj.InitFont(); // 正确示例2:堆上创建对象 YourClass* ptr = new YourClass(); ptr->InitFont();确认成员变量的声明与上下文
- 如果
m_Font是静态成员变量,那不能在类内直接初始化(除了 constexpr 类型),得在源文件里单独初始化:// 头文件 class YourClass { private: static FontType* m_Font; }; // 源文件 FontType* YourClass::m_Font = nullptr; - 绝对不能在静态成员函数里访问非静态成员变量,静态函数没有
this指针,直接访问会导致未定义行为。
- 如果
调试时验证对象状态
当执行到m_Font = new FontType[60];这一行时,先看调试器里this指针的值:- 如果
this是0x0或异常地址,立刻回溯调用栈,找到调用这个函数的地方,确认对象是否被正确创建。
- 如果
更安全的内存管理方案
尽量用智能指针代替裸指针,避免手动管理内存的同时,也能减少这类空指针问题:#include <memory> class YourClass { private: struct FontType { float left; float right; float size; }; std::unique_ptr<FontType[]> m_Font; // 智能指针自动释放内存 public: void InitFonts() { m_Font = std::make_unique<FontType[]>(60); // 初始化每个FontType成员 for (int i = 0; i < 60; ++i) { m_Font[i].left = 0.0f; m_Font[i].right = 0.0f; m_Font[i].size = 12.0f; } } };
内容的提问来源于stack exchange,提问作者PinupPineapple
相关产品推荐
相关产品推荐

