我有std::vector<std::shared_ptr<X>>
我正在查看MSVC矢量复制构造函数实现。我可以看到向量在源向量中迭代并复制每个元素。我可以看到调用placement new的位置并调用shared_ptr构造函数,但是我看不到被调用的类X
的构造函数。我在调试中单步执行代码,我从未到过类X的任何构造函数。
当然在某些时候需要X的复制构造函数?还是我错了?
答案 0 :(得分:4)
std::vector<std::shared_ptr<X>> vec;
for (int i=0; i<10000; ++i)
vec.emplace_back();
我们希望X
的构造函数被调用为零次,X
的复制构造函数被调用为零次,而X
的移动构造函数被调用为零次
std::vector<std::shared_ptr<X>> vec;
vec.push_back(std::make_shared<X>());
for (int i=0; i<10000; ++i)
vec.emplace_back();
我们希望X
的构造函数被调用一次,而X
的复制和移动构造函数将被调用为零次。
我们从不移动或复制X
。我们移动和/或复制shared_ptr
,其中可能包含指向X
的指针。将指针复制到X
不需要我们复制对象。
X *obj = new X;
X *ptr_copy = obj;
也没有在那里调用X的拷贝构造函数。
答案 1 :(得分:1)
shared_ptr的所有副本都指向同一个对象X.当没有复制创建了X的shared_ptr的新副本时。 shared_ptr计算其副本的数量,并在删除shared_ptr的最后一个副本时删除对象。
答案 2 :(得分:0)
执行std :: vector&lt;&gt;的复制构造函数时包含shared_ptr元素,它将增加shared_ptr对象中的计数器。它不会创建X的新对象,而是使用shared_ptr中的计数器增加共享对象的数量。所以你不会看到X
的构造函数的执行