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

C++类成员指针数组Addresses调用MyFunction2触发段错误求助

问题分析与修复方案

核心问题

  1. 静态变量未重置导致数组越界:saveAddresses中的static int i是静态变量,第一次调用UpdateAddresses后,i的值会停在size(节点总数)。第二次调用时,i不会归零,会直接往Addresses[size]及以后的越界位置写入,触发内存访问错误(段错误)。
  2. 内存泄漏:每次UpdateAddresses都用new分配新数组,但从未释放旧的Addresses内存,长期运行会耗尽内存。

修复代码

1. 调整saveAddresses与UpdateAddresses函数

修改MyClass.cpp,移除静态变量,改用引用传递计数器:

void MyClass::saveAddresses(Node* v, int& i){
    if (v == nullptr)
        return;
    saveAddresses(v->left, i);
    saveAddresses(v->right, i);
    Addresses[i++] = v;
    cout << "SAVED: " << v->key << " in " << v << endl;
}

void MyClass::UpdateAddresses(){
    // 释放旧数组,避免内存泄漏
    delete[] Addresses;
    Addresses = new Node*[size];
    int i = 0;
    saveAddresses(root, i);
}

2. 完善类的构造/析构与拷贝控制

修改MyClass.h,初始化指针并处理内存释放,同时避免浅拷贝问题:

class MyClass{ // 补全缺失的class关键字
private:
    int size;
    Node* root;
    Node** Addresses;
    void saveAddresses(Node* v, int& i); // 更新函数声明
    void UpdateAddresses();
public:
    MyClass() : Addresses(nullptr) {
        // 此处需初始化size和root(根据你的树结构设置节点总数)
    }
    ~MyClass() {
        delete[] Addresses; // 析构时释放内存
    }
    // 禁用拷贝构造与赋值,防止浅拷贝导致的二次释放或野指针
    MyClass(const MyClass&) = delete;
    MyClass& operator=(const MyClass&) = delete;

    void MyFunction1() {UpdateAddresses(); cout << Addresses[0] << endl;}
    void MyFunction2() {UpdateAddresses(); cout << Addresses[0] << endl;}
};

修复说明

  • 每次调用UpdateAddresses时,计数器i都会从0开始,确保从数组起始位置写入,不会越界。
  • 每次分配新数组前释放旧数组,解决内存泄漏问题。
  • 构造函数初始化Addresses为nullptr,避免析构时释放野指针;禁用拷贝控制防止浅拷贝带来的内存问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:10:27