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

初始化指针时触发写入访问冲突,动态创建数组遇内存地址无效问题

解决动态创建数组时的写入访问冲突问题

看起来你踩了个经典的空指针调用成员变量的坑啊!先给你拆解下问题的核心:错误提示里的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),这完全是无效内存,写入时必然触发访问冲突。

具体排查与解决步骤

  1. 检查调用成员函数的对象是否有效
    你肯定是用空指针调用了包含m_Font = new FontType[60];的成员函数,比如:

    // 错误示例:用空指针调用成员函数
    YourClass* ptr = nullptr;
    ptr->InitFont(); // 此时this就是nullptr
    

    改成正确的对象实例化方式:

    // 正确示例1:栈上创建对象
    YourClass obj;
    obj.InitFont();
    // 正确示例2:堆上创建对象
    YourClass* ptr = new YourClass();
    ptr->InitFont();
    
  2. 确认成员变量的声明与上下文

    • 如果m_Font是静态成员变量,那不能在类内直接初始化(除了 constexpr 类型),得在源文件里单独初始化:
      // 头文件
      class YourClass {
      private:
          static FontType* m_Font;
      };
      // 源文件
      FontType* YourClass::m_Font = nullptr;
      
    • 绝对不能在静态成员函数里访问非静态成员变量,静态函数没有this指针,直接访问会导致未定义行为。
  3. 调试时验证对象状态
    当执行到m_Font = new FontType[60];这一行时,先看调试器里this指针的值:

    • 如果this是0x0或异常地址,立刻回溯调用栈,找到调用这个函数的地方,确认对象是否被正确创建。
  4. 更安全的内存管理方案
    尽量用智能指针代替裸指针,避免手动管理内存的同时,也能减少这类空指针问题:

    #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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:52:12