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

在其他类的成员函数中创建类指针存入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:54:05