为什么使用填充构造函数初始化指针vector时所有指针地址相同?
问题原因
你调用的是std::vector的填充构造函数,语法为vector<T>(size_t count, const T& value),它的执行逻辑是:
- 先对第二个入参
value完成求值 - 把
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
相关产品推荐
相关产品推荐

