草庐IT

c++ - shared_ptr 和切片

与我共事的人曾经说过shared_ptr是不安全的,并且在从派生类转换为基类(即向上转换)时会切片。例如,如果有2个类A和B,其中B派生自A,则shared_ptra(newB)会切片。我给他指了http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm它说的地方shared_ptrcanbeimplicitlyconvertedtoshared_ptrwheneverT*canbeimplicitlyconvertedtoU*.暗示在这些情况下使用它是安全的,但他似乎并不这么认为。

c++ - 在 Visual C++ 2010 上哪个更快 - std::shared_ptr 或 boost::shared_ptr?

有没有人在Release模式构建中测试过这个?还是实现如此相似而没有显着差异?我对速度感兴趣:创建一个新的shared_ptr创建shared_ptr的拷贝取消引用指针以访问指针对象这将在一个针对速度优化的发布版本中,使用make_shared()创建新的shared_ptr 最佳答案 好的,看来没有人这样做过。以下是我使用WIN32控制台应用程序的标准VC10优化设置发现的内容:VisualC++2010SP1std::make_shared和std::shared_ptr在填充包含1000万个指针条目的vector时比等效的Bo

c++ - 在 for range 循环中迭代包含 vector 的取消引用的 unique_ptr

为什么这段代码不像我想象的那样工作?for(autoit:*std::make_unique>(std::vector({1,2,3,4,5})))std::coutvector对象在执行循环的第一次迭代之前被销毁 最佳答案 range-basedforloop相当于:{init-statementauto&&__range=range_expression;...}对于您的range_expression,它将是auto&&__range=*std::make_unique>(std::vector({1,2,3,4,5}));但

c++ - 如何将派生类的 shared_ptr vector 转换为基类的 shared_ptr vector

classInterface{};classClass:publicInterface{};classFoo{public:std::vector>&GetInterfaces(){return*(std::vector>*)(&m_data);//returnm_data;}private:std::vector>m_data;};这行得通,但又丑又吓人。有更好/更安全的方法吗?我不想做m_data类型std::vector>因为模块Foo完全属于Class作品的,Interface(和Foo::GetInterfaces())被实现为与一个单独的模块交互,该模块应该只知道Inter

c++ - 在 C++ 中创建 vector 的 shared_ptr

这个问题在这里已经有了答案:Callinginitializer_listconstructorviamake_unique/make_shared(2个答案)关闭6年前。在现代C++中,我们可以像这样初始化一个vector:std::vectorv={1,2,3,4,5};但是如果我尝试创建一个指向vector的智能指针,这将无法编译:autov=std::make_shared>({1,2,3,4,5});有没有比在创建后求助于push_back更好的选择?

c++ - 为什么 unique_ptr 析构函数的异常会终止程序?

看看这段代码,它导致程序在未捕获异常的情况下终止。#include#include#include#includeusingnamespacestd;structtest{~test()noexcept(false){throwruntime_error("-my-cool-exception-");}};intmain(){try{autoptr=unique_ptr(newtest());//testt;//thisisok,withoutunique_ptritworksfine.}catch(exception&e){cout这个问题不同于堆栈溢出问题:throwingexce

c++ - 使用 std::unique_ptr 将所有权转移到函数

我正在努力学习如何使用智能指针和理解所有权。当我按值将auto_ptr传递给函数时,该函数获得该指针的独占所有权。因此,当函数完成时,它会删除我传递给它的指针。但是,当我尝试使用unique_ptr执行此操作时出现编译错误,就好像unique_ptr的复制分配被禁用一样。通过引用传递unique_ptr似乎并没有转移所有权,它只是为函数提供了对unique_ptr的引用。如何通过将所有权传递给函数来获得auto_ptr的行为以使用unique_ptr?如果能提供有关unique_ptr的详细教程的链接,我将不胜感激,因为到目前为止,我读过的教程似乎只谈论auto_ptr或谈论Boost

c++ - 前向声明和 shared_ptr

我正在尝试重构我的代码,以便使用前向声明而不是包含大量header。我是新手,对boost::shared_ptr有疑问。假设我有以下界面:#ifndefI_STARTER_H_#defineI_STARTER_H_#includeclassIStarter{public:virtual~IStarter(){};virtualoperator()()=0;};typedefboost::shared_ptrIStarterPtr;#endif然后我在另一个类中有一个函数,它接受一个IStarterPtr对象作为参数,比如说:virtualvoidaddStarter(IStarter

c++ - std::remove_if 来自 std::vector 的多态 std::unique_ptr

我有一个包含三个类的层次结构,其中Derived源自Selectable和Drawable.然后我有一个std::vector的std::unique_ptr我用Derived填充对象。我确定该vector将仅由同时从两个基派生的对象填充。当我尝试使用指向Selected的指针从vector中删除某个元素时,问题就来了.#include#include#includestructSelectable{virtual~Selectable()=0;};Selectable::~Selectable()=default;structDrawable{virtual~Drawable()=0

c++ - 如何将 unique_ptr 的 vector 声明为类数据成员?

我想要一个unique_ptrvector作为我正在创建的类的成员。classFoo{[...]private:vector>barList;}但随后我开始收到来自VS2010编译器的神秘错误消息:errorC2248:'std::unique_ptr::operator=':cannotaccessprivatememberdeclaredinclass'std::unique_ptr'连同下面的一些错误行,这些错误行深入探讨了Microsoft对std::_Copy_impl的实现。...我把成员声明改成了vector>*barList;然后编译。但是我不禁想知道为什么我不能按照我