std::vector<std::shared_ptr<XXX> > 初始化的坑

现在写 C++ 用智能指针基本是习惯了,不过今天遇到一个细节处的错误:

std::vector<std::shared_ptr<A> > a_vec(n, std::make_shared<A>());

本意是初始化了一个元素都是智能指针对象的数组,看起来很美好,实际上这个数组里所有元素都指向了同一个实例。看一下 C++ 文档上的参数说明:

val
Value to fill the container with. Each of the n elements in the container will be initialized to a copy of this value. Member type value_type is the type of the elements in the container, defined in vector as an alias of its first template parameter (T).

vector 所有成员用 val 的拷贝来初始化,智能指针的拷贝嘛,还是指向同一个实例。

正确的初始化方式:

std::vector<std::shared_ptr<A> > a_vec(n);
std::for_each(std::begin(a_vec), std::end(a_vec), [](std::shared_ptr<A> &ptr) {
  ptr = std::make_shared<A>();
});