Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向量<;共享\u ptr<;X>&燃气轮机;正在复制调用的-X构造函数?_C++_C++11_Vector_Shared Ptr - Fatal编程技术网

C++ 向量<;共享\u ptr<;X>&燃气轮机;正在复制调用的-X构造函数?

C++ 向量<;共享\u ptr<;X>&燃气轮机;正在复制调用的-X构造函数?,c++,c++11,vector,shared-ptr,C++,C++11,Vector,Shared Ptr,我有一个std::vector 我正在研究MSVC向量复制构造函数的实现。我可以看到向量迭代源向量并复制每个元素的位置。我可以看到调用placement new和调用shared_ptr构造函数的位置,但是我看不到调用classX的构造函数。我正在调试代码,但我从未从类X中找到任何构造函数 肯定在某个时候需要X的复制构造函数?还是我错了 如果我们有代码: 我们希望X的构造函数调用一次,而X的复制和移动构造函数调用零次 为什么? 我们从不移动或复制X。我们移动和/或复制一个共享\u ptr,其中可

我有一个
std::vector

我正在研究MSVC向量复制构造函数的实现。我可以看到向量迭代源向量并复制每个元素的位置。我可以看到调用placement new和调用shared_ptr构造函数的位置,但是我看不到调用class
X
的构造函数。我正在调试代码,但我从未从类X中找到任何构造函数

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

如果我们有代码: 我们希望
X
的构造函数调用一次,而
X
的复制和移动构造函数调用零次

为什么? 我们从不移动或复制
X
。我们移动和/或复制一个
共享\u ptr
,其中可能包含指向
X
的指针。复制指向
X
的指针不需要复制对象

X *obj = new X;
X *ptr_copy = obj;
那里也没有调用X的复制构造函数。

如果我们有代码: 我们希望
X
的构造函数调用一次,而
X
的复制和移动构造函数调用零次

为什么? 我们从不移动或复制
X
。我们移动和/或复制一个
共享\u ptr
,其中可能包含指向
X
的指针。复制指向
X
的指针不需要复制对象

X *obj = new X;
X *ptr_copy = obj;

也没有调用X的复制构造函数。

共享的ptr的所有副本都指向同一个对象X。当创建的共享的ptr的新副本X没有被复制时。
shared_ptr统计其副本的数量,并在删除共享_ptr的最后一个副本时删除对象。

共享_ptr的所有副本都指向同一个对象X。当创建的共享_ptr的新副本X未被复制时。
shared_ptr统计其副本数,并在删除共享_ptr的最后一个副本时删除对象。

当为包含共享_ptr元素的std::vector执行副本构造函数时,它将增加共享_ptr对象内的计数器。它不会创建一个新的X对象,而是使用shared_ptr中的计数器增加共享对象的数量。因此,当您为包含共享\u ptr元素的std::vector执行复制构造函数时,将不会看到执行X的构造函数,它将增加共享\u ptr对象中的计数器。它不会创建一个新的X对象,而是使用shared_ptr中的计数器增加共享对象的数量。因此,您将不会看到X的构造函数的执行,我想知道这是否是因为shared_ptr已经包含了“数据”。谢谢。我想知道是不是因为共享的ptr已经包含了“数据”。谢谢。共享指针别名为它们的指针对象:指针的所有副本都指向同一个对象。它不是克隆或深度复制指针。这真的相当邪恶;小心使用!共享指针将其指针对象别名为:指针的所有副本都指向同一对象。它不是克隆或深度复制指针。这真的相当邪恶;小心使用!
X *obj = new X;
X *ptr_copy = obj;