C++ vector无法保存对象父指针,程序崩溃求助
问题原因与解决方案
崩溃原因
你的代码崩溃核心是拷贝构造函数未正确复制parent指针:
- 执行
List.push_back(a2)时,vector会调用类A的拷贝构造函数创建新元素存入容器,但你定义的拷贝构造函数只复制了num,完全没处理parent指针,导致vector中的A对象的parent是未初始化的野指针。 - 后续
A temp = List.front();又一次调用拷贝构造函数,temp的parent同样是野指针。访问temp.parent->num时,程序尝试访问非法内存,直接崩溃。
快速修复代码
先修正拷贝构造函数,让它复制parent指针(浅拷贝,适合当前场景,因为parent指向栈上的a1,生命周期稳定),同时给默认构造函数加上成员初始化,避免野指针:
#include <iostream> #include <vector> using namespace std; class A { public: int num; A* parent; // 带初始化的默认构造函数 A() : num(0), parent(nullptr) {}; // 修正后的拷贝构造函数 A(const A &s) { this->num = s.num; this->parent = s.parent; // 复制parent指针 } }; int main() { A a1; a1.num = 2; A a2 = a1; a2.parent = &a1; vector<A> List; List.push_back(a2); A temp = List.front(); cout << temp.parent->num << endl; // 现在会正常输出2 return 0; }
深拷贝构造函数的处理方式
如果你需要对parent指向的对象进行深拷贝(即复制整个对象而非仅指针),就要在拷贝构造函数中创建新的A对象,并管理好内存:
class A { public: int num; A* parent; A() : num(0), parent(nullptr) {}; // 深拷贝构造函数 A(const A &s) { this->num = s.num; // 深拷贝parent指向的对象 if (s.parent != nullptr) { this->parent = new A(*s.parent); } else { this->parent = nullptr; } } // 析构函数释放内存,避免泄漏 ~A() { delete parent; } // 为了遵循三/五法则,重载赋值运算符 A& operator=(const A &s) { if (this == &s) return *this; // 先释放当前parent的内存 delete parent; this->num = s.num; // 深拷贝新的parent if (s.parent != nullptr) { this->parent = new A(*s.parent); } else { this->parent = nullptr; } return *this; } };
注意:深拷贝场景下必须遵循三/五法则,即同时定义拷贝构造函数、析构函数、赋值运算符重载(C++11及以后还要考虑移动构造和移动赋值),否则会出现内存泄漏或重复释放的问题。
内容的提问来源于stack exchange,提问作者geon_is_here
相关产品推荐
相关产品推荐

