草庐IT

Unique_ptr

全部标签

c++ - 使用带有 std::unique_ptr 的抽象删除器

我想要一个提供一些创建方法的运行时界面。这些方法返回unique_ptr,并且我想通过创建类启用自定义删除。问题是我绝对不希望接口(interface)直接提供这些方法——它们应该只在销毁unique_ptr时可用。.现在,我想我可以使用std::unique_ptr>,但我真的不想这样做,因为我根本不需要那种抽象级别,而且我不想支付堆分配费用。有什么建议吗? 最佳答案 我不太清楚您的规范,但您是否考虑过unique_ptr?这是一种非常灵活的类型,具有动态删除器的许多特性。如果这不是您想要的,您可以尝试以下方法:classimpl

c++ - 从核心转储中识别 auto_ptr 背后对象的具体类型

我有一个auto_ptr,其中IFoo是一个只有纯虚拟方法的接口(interface)。我现在在段错误后还有一个核心文件,我真的很想知道这个auto_ptr背后的具体子类是什么。作为dynamic_cast在项目中工作,我认为RTTI必须以某种方式可用,但我不知道如何通过gdb访问此信息。?我得到的输出如下:(gdb)printthis->obj._M_ptr$22=(classmartin::IFoo*)0x7418我真正想知道的是,指针是否属于IBar或IBaz.感谢您的帮助! 最佳答案 WhatI'dreallyliketok

c++ - 使用 unique_ptr<> 实现列表?

据我了解,unique_ptr表示专有所有权。单向链表似乎适合这种情况,每个节点都拥有下一个节点,例如(伪代码警报)classnode{public:unique_ptrnext;intvalue;};但我不明白如何执行像遍历列表这样的操作,我习惯这样做here=here->next;如何使用unique_ptr实现数据结构?它们是这项工作的正确工具吗? 最佳答案 当你遍历节点时,你不需要拥有节点指针,这意味着here=here->next;如果这里是unique_ptr则不正确。拥有一个对象意味着“对其生死负责”,这意味着所有者是

c++ - 动态分配二维智能指针数组的语法

我需要动态分配一个二维智能指针数组,但它的语法让我感到困惑。我需要它是动态的:std::unique_ptrmyArray[size1][size2];因此据我了解,我创建了一个指向该类型指针的指针:someClass**myArray;//actaullythetypeisstd::unique_ptrbutI'lljustkeepitsimple然后分配它:myArray*=newsomeClass*[size1];for(inti=0;i但这并没有使用智能指针,这意味着我以后必须手动删除它,而且我不知道如何使这些指针成为智能指针;类型是std::unique_ptr但我需要一个指

c++ - 我可以修改 std::exception_ptr 中异常的值吗?

如果我在std::exception_ptr中存储了一个异常。我使用std::rethrow_exception重新抛出异常,使用catch(MyException&)访问它,然后修改值。如果我再次抛出相同的异常,我是否应该观察我所做的修改?下面的代码展示了我的想法:#include#includestructMyException{intvalue;};intmain(){std::exception_ptra=std::make_exception_ptr(MyException());try{std::rethrow_exception(a);}catch(MyException

c++ - 如何过早销毁智能指针

我有一个类有一个setter方法,它接受一个unique_ptr作为参数。该unique_ptr被保存为类成员。classTestClass{std::unique_ptrsp;voidsetTester_Way1(std::unique_ptrte){autodeleter=std::move(sp);sp=std::move(te);}voidsetTester_Way2(std::unique_ptrte){sp=std::move(te);}};哪种方式才是正确设置智能指针的方式?Way2是否泄露了sp的原始指针? 最佳答案

c++ - unique_ptr 不在编译器资源管理器中生成删除指令?

我一直在研究CompilerExplorer最近。我加载了其中一个采用指针参数的示例,并将其更改为采用unique_ptr参数。但我注意到在输出程序集中,明显没有对operatordelete的调用。我很好奇是否有人知道为什么。这是您可以粘贴到资源管理器中的示例。确保同时将-O3放入编译器选项中。#includeusingstd::unique_ptr;voidmaxArray(unique_ptrx,unique_ptry){for(inti=0;ix[i])x[i]=y[i];}}编辑:同样为了比较,如果我改为粘贴来自cppreference的代码示例之一,那么我会在输出中获取运算

c++ - 将 unique_ptr 从一个集合移动到另一个集合

我似乎无法弄清楚并尝试了以下建议:Move`unique_ptr`sbetweensetshowtomoveanstd::unique_ptrfromoneSTLcontainertoanother?我有两个包含唯一指针的集合:std::set>s1,s2;指针当然是唯一的,但some_type的值可能是也可能不是,所以在将s2连接到s1之后,s1的大小可能与|s1+s2|相同或一样大。看来我应该能够做到这一点:move(s2.begin(),s2.end(),inserter(s1,s1.end()));但这在clang++3.8/g++5.4中失败了。这里缺少什么?

c++ - std::make_shared/std::make_unique 不使用列表初始化有什么原因吗?

具体来说:直接列表初始化(cppreference.com(3))。两者都是std::make_shared和统一初始化特性在C++11中被引入。所以我们可以在堆上分配对象时使用聚合初始化:newFoo{1,"2",3.0f}.这是一种直接初始化没有构造函数的对象的好方法,例如聚合、pod等。根据我的经验,现实生活中的场景(例如在函数中声明临时结构)以有效地向lambda提供参数集变得非常普遍:voidfoo(){structLambdaArgs{std::stringarg1;std::stringarg2;std::stringarg3;};autoargs=std::make_s

c++ - 如何测试 shared_ptr 是空的还是什么都不拥有

C++std::shared_ptr可能是空,也可能是null。这两个概念都存在,而且它们不是等价的。此外,这些情况之间的任何一种暗示都不总是正确的。后一种情况检测起来很简单,因为operatorbool恰好提供了那个测试。根据文档,它“检查*this是否存储了一个非空指针,即是否get()!=nullptr。”是否有针对前一种情况的测试,即事物为空的情况?我对此的使用非常简单。我有一个具有静态工厂方法的类。静态工厂方法里面是一个静态本地shared_ptr到类的一个实例,初始化为nullptr.对该工厂方法的第一次调用构造该类的实例并初始化静态本地shared_ptr在返回它的拷贝之