求助:C++函数返回的Vector无法正确输出值
问题分析与解决
你的问题和vector内存重分配无关,核心是悬垂指针引发的未定义行为:
foo(A a)的参数是传值调用,进入函数时main里的a会被复制为foo内部的局部变量a。- 你在foo中让
a1.parent = &a;,这里的&a指向的是foo内部的这个局部变量。 - 当foo执行完毕返回时,该局部变量
a会被销毁,其占用的内存会被系统回收或复用。 - 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
相关产品推荐
相关产品推荐

