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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:20:35