在其他类的成员函数中创建类指针存入vector后读值异常如何解决
问题原因
- 你存入vector的指针指向了栈上的局部临时对象:
B obj_b(n)是定义在A::func函数内部的栈变量,函数执行结束后栈帧会被回收,这个变量占用的内存会被系统标记为可复用,你存在vector里的指针直接变成野指针,后续访问这个地址的行为属于未定义行为,所以才会输出随机值32765而不是预期的4。
修正方案
你可以根据业务场景选择两种常用修正方案:
方案1:改用堆内存分配对象,自行管理生命周期
如果必须存储指针(比如需要用到多态特性),可以用new在堆上创建对象,堆上的对象不会随着函数结束自动销毁,使用完后记得手动delete避免内存泄漏。
修正后的完整代码:
#include <iostream> #include <vector> class B { public: int b; B (int n) { b = n; } }; std::vector<B*> v; class A { public: int a; void func(int n); }; void A::func(int n) { // 改为在堆上创建对象,生命周期由自己控制 B* ptr = new B(n); v.push_back(ptr); } int main() { A obj_a; obj_a.a = 5; obj_a.func(4); std::cout << obj_a.a << std::endl; for (auto it : v) { std::cout << it->b << std::endl; } // 用完记得释放堆内存,避免内存泄漏 for (auto it : v) { delete it; } v.clear(); return 0; }
方案2:修改vector存储类型,直接存对象而非指针
如果没有多态需求,直接把vector的元素类型改成B,存入的时候直接拷贝对象,不需要手动管理指针生命周期,代码更安全。
核心修改点如下:
// 修改vector定义,直接存储B对象 std::vector<B> v; // 修改func函数逻辑,直接存入对象 void A::func(int n) { B obj_b(n); v.push_back(obj_b); } // 遍历的时候直接访问成员即可 for (auto& it : v) { std::cout << it.b << std::endl; }
内容的提问来源于stack exchange,提问作者Danger69420
相关产品推荐
相关产品推荐

