C++类成员指针数组Addresses调用MyFunction2触发段错误求助
问题分析与修复方案
核心问题
- 静态变量未重置导致数组越界:
saveAddresses中的static int i是静态变量,第一次调用UpdateAddresses后,i的值会停在size(节点总数)。第二次调用时,i不会归零,会直接往Addresses[size]及以后的越界位置写入,触发内存访问错误(段错误)。 - 内存泄漏:每次
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
相关产品推荐
相关产品推荐

