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

为什么使用填充构造函数初始化指针vector时所有指针地址相同?

问题原因

你调用的是std::vector的填充构造函数,语法为vector<T>(size_t count, const T& value),它的执行逻辑是:

  1. 先对第二个入参value完成求值
  2. 把value拷贝count次,依次作为vector的所有初始元素

你代码里第二个入参是new A(),这个表达式只会执行一次:仅在堆上分配1个A类实例,返回对应的内存地址,之后这个地址被拷贝2次存入vector,自然两个元素存储的指针值完全相同,指向同一个对象。

正确实现方案
  • 方案1:循环逐个插入
class A{
public:
    int a;
    A(): a(0){}
    A(int a): a(a){}
};
int main() {
    vector<A*> v;
    v.reserve(2); // 提前预分配空间,减少后续扩容开销
    for (int i = 0; i < 2; ++i) {
        v.push_back(new A()); // 每次循环都会执行一次new,生成独立对象
    }
    cout << v[0] << endl;
    cout << v[1] << endl; // 两个地址不同

    // 注意:使用裸指针需要手动释放内存,避免泄漏
    for (auto ptr : v) {
        delete ptr;
    }
    return 0;
}
  • 方案2:C++11及以上版本可以用初始化列表
vector<A*> v{new A(), new A()};

额外建议:优先使用智能指针(std::unique_ptr<A>/std::shared_ptr<A>)代替裸指针存储到vector中,不需要手动管理内存,能避免内存泄漏风险。

内容的提问来源于stack exchange,提问作者taswell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:54:02