c++ - vector<shared_ptr<X>> copying-调用了X构造函数?

标签 c++ c++11 vector shared-ptr

我有一个 std::vector<std::shared_ptr<X>>

我正在查看 MSVC vector 复制构造函数的实现。我可以看到 vector 在何处迭代源 vector 并复制每个元素。我可以看到在哪里调用了 placement new 并调用了 shared_ptr 构造函数,但是我看不到类 X 的构造函数被调用。我在调试中单步执行代码,但从未访问过 X 类的任何构造函数。

肯定在某些时候需要 X 的复制构造函数?还是我错了?

最佳答案

如果我们有代码:

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 的复制构造函数。

关于c++ - vector<shared_ptr<X>> copying-调用了X构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29572417/

相关文章:

c++ - 我们应该将 COM 中的 BSTR 类型视为值还是引用?

c++ - std::shared_ptr<T>:指向 T 的右值指针的隐式构造函数

c++ - 如何在 C++ 中将 vector 和标量相乘?

C++从带有&返回指向未初始化结构的指针的 vector 获取结构

c++ - QML:如何在不实际移动任何可见组件的情况下在 MouseAeria 上获得鼠标移动的方向?

c++ - 在 glm 和 OpenGL 中合成变换

c++ - make_shared() 的可调试替代品

c++ - CPP:对空 vector size()输出的算术运算,给出不确定的行为

c++ - 我应该在哪里释放对象?

c++ - 函数模板 : default first template argument to second