我正试着把我的头放在分享的指点上,以及它们是如何工作的。我非常感谢你能在下面给我的任何建议。
请你就下列事项提出建议:
当使用std::
vector_declared_outside_for_loop.emplace_back(std::make_shared(object(std::string user_input))),在for循环结束后,for循环中的shared_ptr会发生什么?
如果我现在在后续的for循环(如..)中从vector_declared_outside_for_loop和其他变量(如int number_input )中生成一个shared_ptrs对向量,则为number_input。
std::vector<std::pair<shared_ptr<object>, int>> new_vector;
for(int i{0}; i<.size(); ++i){
new_vector.push_back(std::make_pair(shared_ptr<object> vector_declared_outside_for_loop [i], int connection_type));
}shared_ptrs在new_vector中是否指向任何东西?还是我只是把new_vector推回去了?
发布于 2022-05-17 16:04:34
std::move。只需忘记所有您认为您知道的关于std::move的知识,并学习一个简单的规则:std::move的意思是:我不再需要这个(名称对象)。所以func1(std::move(func2(...)))是没有意义的。返回的对象没有名称,您无法再次使用它。编译器知道这一点,并且已经在没有std::move的情况下使用move。说我不再需要这是没有意义的,因为在func1调用之后,临时对象不再存在。
emplace_back中放置的是shared_ptr,而不是它所指向的对象时。因此,shared_ptr是在vector内部构造的,其中有一个指向它分配和构造的对象的指针。for循环中的shared_ptr根本不存在。这就是emplace_back的要点,即它不创建临时对象,而是直接在向量内部构造对象。
push_back通常接受一个对象并将其复制到向量中。因此,您将创建一个临时对象,复制并销毁该临时对象。但STL并不愚蠢,也涵盖了这个案子。如果您push_back一个可以移动的对象,那么它将被转发到emplace_back。因此,这对将直接构造在向量内。这就剩下vector_declared_outside_for_loop了。因为它是一个现有的对象,所以不能就地构造。因为它是一个命名的对象,所以不能移动它。所以这些对象就会被复制。
对于shared_ptr,这意味着内部指针将被复制,对象的引用计数将以原子方式递增。因此,在循环的末尾,shared_ptr将有一个.size() + 1的引用计数。然后,在作用域的末尾,原始shared_ptr超出范围,将引用数减少1。向量中使用的对象保持不变。。
https://stackoverflow.com/questions/72276914
复制相似问题