草庐IT

c++ - 为什么 unique_ptr 实例化编译为比原始指针更大的二进制文件?

我一直认为std::unique_ptr与使用原始指针相比没有开销。但是,编译如下代码#includevoidraw_pointer(){int*p=newint[100];delete[]p;}voidsmart_pointer(){autop=std::make_unique(100);}使用g++-std=c++14-O3生成以下程序集:raw_pointer():subrsp,8movedi,400calloperatornew[](unsignedlong)addrsp,8movrdi,raxjmpoperatordelete[](void*)smart_pointer():

c++ - 使用observer_ptr

构造std::observer_ptr的真正意义是什么?在库基础技术规范V2中?在我看来,它所做的只是包装一个裸露的T*,如果它没有增加动态内存安全性,这似乎是一个多余的步骤。在我的所有代码中,我使用std::unique_ptr我需要明确拥有一个对象的所有权和std::shared_ptr我可以共享对象的所有权。这非常有效,可以防止意外解除对已销毁对象的引用。当然,std::observer_ptr不保证所观察对象的生命周期。如果它是从std::unique_ptr或std::shared_ptr构造的,我会看到这种结构的用途,但任何简单的代码使用T*可能只是继续这样做,如果他们打算

c++ - 使用observer_ptr

构造std::observer_ptr的真正意义是什么?在库基础技术规范V2中?在我看来,它所做的只是包装一个裸露的T*,如果它没有增加动态内存安全性,这似乎是一个多余的步骤。在我的所有代码中,我使用std::unique_ptr我需要明确拥有一个对象的所有权和std::shared_ptr我可以共享对象的所有权。这非常有效,可以防止意外解除对已销毁对象的引用。当然,std::observer_ptr不保证所观察对象的生命周期。如果它是从std::unique_ptr或std::shared_ptr构造的,我会看到这种结构的用途,但任何简单的代码使用T*可能只是继续这样做,如果他们打算

c++ - 那么在 STL 集合中可以安全地使用 unique_ptr 吗?

我对unique_ptr和右值移动哲学感到困惑。假设我们有两个集合:std::vector>autoCollection;std::vector>uniqueCollection;现在我预计以下操作会失败,因为不知道算法在内部做什么,并且可能会制作内部数据透视拷贝等,从而剥夺auto_ptr的所有权:std::sort(autoCollection.begin(),autoCollection.end());我明白了。并且编译器正确地不允许这种情况发生。然后我这样做:std::sort(uniqueCollection.begin(),uniqueCollection.end());然

c++ - 那么在 STL 集合中可以安全地使用 unique_ptr 吗?

我对unique_ptr和右值移动哲学感到困惑。假设我们有两个集合:std::vector>autoCollection;std::vector>uniqueCollection;现在我预计以下操作会失败,因为不知道算法在内部做什么,并且可能会制作内部数据透视拷贝等,从而剥夺auto_ptr的所有权:std::sort(autoCollection.begin(),autoCollection.end());我明白了。并且编译器正确地不允许这种情况发生。然后我这样做:std::sort(uniqueCollection.begin(),uniqueCollection.end());然

c++ - boost ,shared_ptr 与 weak_ptr?什么时候用?

在我当前的项目中,我非常广泛地使用boost::shared_ptr。最近我的队友也开始使用weak_ptr。我不知道该使用哪一个以及何时使用。除此之外,如果我想将weak_ptr转换为shared_ptr应该怎么做。锁定weak_ptr以创建shared_ptr会影响我在其他线程中的代码吗? 最佳答案 总的来说和总结,强指针保证它们自己的有效性。例如,在以下情况下使用它们:您拥有被指向的对象;你创建它并销毁它如果对象不存在,您没有定义的行为您需要强制该对象存在。弱指针保证知道它们自己的有效性。例如,在以下情况下使用它们:您可以访问

c++ - boost ,shared_ptr 与 weak_ptr?什么时候用?

在我当前的项目中,我非常广泛地使用boost::shared_ptr。最近我的队友也开始使用weak_ptr。我不知道该使用哪一个以及何时使用。除此之外,如果我想将weak_ptr转换为shared_ptr应该怎么做。锁定weak_ptr以创建shared_ptr会影响我在其他线程中的代码吗? 最佳答案 总的来说和总结,强指针保证它们自己的有效性。例如,在以下情况下使用它们:您拥有被指向的对象;你创建它并销毁它如果对象不存在,您没有定义的行为您需要强制该对象存在。弱指针保证知道它们自己的有效性。例如,在以下情况下使用它们:您可以访问

c++ - 从队列中删除 unique_ptr

我正在尝试弄清楚如何/是否可以在queue中使用unique_ptr。//createqueuestd::queue>q;//addelementstd::unique_ptrp(newint{123});q.push(std::move(p));//trytograbtheelementautop2=foo_queue.front();q.pop();我明白为什么上面的代码不起作用。由于front和pop是2个独立的步骤,因此无法移动元素。有没有办法做到这一点? 最佳答案 你应该明确地说你想要移动指针离开队列。像这样:std::u

c++ - 从队列中删除 unique_ptr

我正在尝试弄清楚如何/是否可以在queue中使用unique_ptr。//createqueuestd::queue>q;//addelementstd::unique_ptrp(newint{123});q.push(std::move(p));//trytograbtheelementautop2=foo_queue.front();q.pop();我明白为什么上面的代码不起作用。由于front和pop是2个独立的步骤,因此无法移动元素。有没有办法做到这一点? 最佳答案 你应该明确地说你想要移动指针离开队列。像这样:std::u

c++ - 使用 make_shared 创建 shared_ptr 有什么缺点吗

使用make_shared()有什么缺点吗?而不是使用shared_ptr(newT).Boostdocumentation状态Therehavebeenrepeatedrequestsfromusersforafactoryfunctionthatcreatesanobjectofagiventypeandreturnsashared_ptrtoit.Besidesconvenienceandstyle,suchafunctionisalsoexceptionsafeandconsiderablyfasterbecauseitcanuseasingleallocationforbot