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

求助:C++函数返回的Vector无法正确输出值

问题分析与解决

你的问题和vector内存重分配无关,核心是悬垂指针引发的未定义行为:

  1. foo(A a)的参数是传值调用,进入函数时main里的a会被复制为foo内部的局部变量a。
  2. 你在foo中让a1.parent = &a;,这里的&a指向的是foo内部的这个局部变量。
  3. 当foo执行完毕返回时,该局部变量a会被销毁,其占用的内存会被系统回收或复用。
  4. foo内部的cout能正常输出,是因为此时局部变量a还未被销毁;但回到main后,temp.parent已经是指向失效内存的悬垂指针,访问其指向的内容属于未定义行为,结果自然是随机的大数值。

解决方案

要解决这个问题,需让parent指针指向生命周期足够长的对象,以下是几种可行方案:

方案1:改用传引用参数

将foo的参数改为传引用,让指针指向main里的原始对象,其生命周期与main一致:

class A {
    public: int num;
    public: A* parent;

    A(){};

    A(const A &s)
    {
        this->num = s.num;
        this->parent = s.parent;
    }

    public : vector <A> foo(A& a)  // 修改为传引用
    {
        A a1;
        a1.num = a.num;
        a1.parent = &a;  // 指向main中的原始a,生命周期足够长
    
        vector <A> list;
        list.push_back(a1);
        
        A temp = list.front();
    
        cout << temp.parent->num << endl;

        return list;
    }
};

int main()
{
    A a; 
    a.num =2;

    vector <A> list = a.foo(a);

    A temp = list.front();

    cout << temp.parent->num << endl;
    return 0;
}

方案2:使用动态分配对象(需手动管理内存)

通过new分配对象,手动控制其生命周期,但要记得用完后释放内存避免泄漏:

class A {
    public: int num;
    public: A* parent;

    A(){};

    A(const A &s)
    {
        this->num = s.num;
        this->parent = s.parent;
    }

    public : vector <A> foo(A a)
    {
        A* ptr = new A(a); // 动态分配对象,生命周期由手动控制
        A a1;
        a1.num = a.num;
        a1.parent = ptr;
    
        vector <A> list;
        list.push_back(a1);
        
        A temp = list.front();
    
        cout << temp.parent->num << endl;

        return list;
    }
};

int main()
{
    A a; 
    a.num =2;

    vector <A> list = a.foo(a);

    A temp = list.front();

    cout << temp.parent->num << endl;
    delete temp.parent; // 释放动态分配的内存
    return 0;
}

方案3:使用智能指针(推荐,自动管理内存)

用std::shared_ptr替代裸指针,自动管理对象生命周期,避免内存泄漏和悬垂指针:

#include <memory> // 引入智能指针头文件

class A {
    public: int num;
    public: std::shared_ptr<A> parent; // 替换为shared_ptr

    A(){};

    A(const A &s) : num(s.num), parent(s.parent) {} // 初始化列表写法更规范

    public : vector <A> foo(std::shared_ptr<A> a)
    {
        A a1;
        a1.num = a->num;
        a1.parent = a;
    
        vector <A> list;
        list.push_back(a1);
        
        A temp = list.front();
    
        cout << temp.parent->num << endl;

        return list;
    }
};

int main()
{
    auto a = std::make_shared<A>(); 
    a->num =2;

    vector <A> list = a->foo(a);

    A temp = list.front();

    cout << temp.parent->num << endl;
    return 0;
}

内容的提问来源于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:45:29