草庐IT

Unique_ptr

全部标签

c++ - 引用计数在 shared_ptr 中不起作用

以下代码会导致运行时错误。每个shared_ptr拥有相同的内存,但每个的计数仍然是一。因此,每个共享指针都是不同的,所以当它们超出范围时,它们会尝试释放block,这会导致堆损坏。我的问题是如何避免这种情况?只想添加这样的声明shared_ptrx(p);不可协商,我必须声明。#include#includeusingnamespacestd;intmain(){int*p=newint(10);shared_ptra(p);shared_ptrb(p);shared_ptrc(p);shared_ptrd(p);cout 最佳答案

c++ - 我可以将函数的输出参数存储到 unique_ptr 中吗?

我有以下代码:classThing{};voidfnc(Thing**out){*out=newThing();};其中fnc通过输出参数返回Thing的新实例。通常我会按如下方式使用它:intmain(){Thing*thing;fnc(&thing);}我可以将返回的对象放在std::unique_ptr中吗?intmain(){std::unique_ptruniqueThing;fnc(???);} 最佳答案 要扩展您的代码示例,它(即传递指针)将是voidfnc(std::unique_ptr*out){out->rese

c++ - 如何用空指针初始化 unique_ptr 的 vector ?

我需要初始化一个vector>与nullptr秒。this中的方法帖子太复杂了。我的情况比较特殊,只需要初始化为nullptr.我怎样才能实现它?我知道我可以使用for循环来push_back一个nullptr每一次。有什么优雅的方法吗?顺便说一句,make_unqiue不适用于我的编译器。#include#include#includeusingnamespacestd;structTNode{//charch;boolisWord;vector>children;TNode():isWord(false),children(26,nullptr){}};intmain(){TNod

c++ - 为什么 shared_ptr 有显式构造函数

我想知道为什么shared_ptr没有隐式构造函数。这里提到了它没有的事实:Gettingaboost::shared_ptrforthis(我想出了原因,但认为无论如何发帖都会是一个有趣的问题。)#include#includeusingnamespaceboost;usingnamespacestd;voidfun(shared_ptrptr){cout'requested*/ 最佳答案 在这种情况下,shared_ptr将尝试释放您分配给堆栈的int。你不会想要那样的,所以显式构造函数会让你考虑一下。

c++ - std::list of boost::shared_ptr 的迭代器问题

我在使用以下代码时遇到问题:#include#include#include"Protocol/IMessage.hpp"templateclassConnection{public:typedefIMessageMessageType;typedefboost::shared_ptrMessagePointer;templatevoidFlushMessageQueue(Handlerhandler){std::list::iteratorib=message_queue_.begin();//line69std::list::iteratorie=message_queue_.en

c++ - boost shared_ptr use_count 函数

我的申请问题如下-我有一个大结构foo。因为它们很大并且出于内存管理的原因,我们不希望在数据处理完成后删除它们。我们将它们存储在std::vector>.中我的问题与了解所有处理何时完成有关。第一个决定是我们不希望任何其他应用程序代码在结构中标记一个完整的标志,因为程序中有多个执行路径,我们无法预测哪一个是最后一个。因此在我们的实现中,一旦处理完成,我们将删除boost::shared_ptr>的所有拷贝除了vector中的那个。这会将shared_ptr中的引用计数器降为1。使用shared_ptr.use_count()查看它是否等于1以了解我的应用程序的所有其他部分何时处理完数据

c++ - boost::shared_ptr<const T> 到 boost::shared_ptr<T>

我想从boost::shared_ptr中转换常量,但我boost::const_pointer_cast不是答案。boost::const_pointer_cast想要一个constboost::shared_ptr,不是boost::shared_ptr.让我们放弃强制性的“你不应该那样做”。我知道...但我需要这样做...那么最好/最简单的方法是什么?为了清楚起见:boost::shared_ptrorig_ptr(newT());boost::shared_ptrnew_ptr=magic_incantation(orig_ptr);我需要知道magic_incantation

原始指针和 shared_ptr 之间的 C++ 接口(interface)

我的代码自始至终都使用原始指针。它需要调用一个方法,将原始指针放入shared_ptr。这个方法不受我控制,属于外部api。我不能只将指针传递给shared_ptr因为它什么时候会被删除当shared_ptr超出方法的范围时(当方法返回时)。除了在内部代码中将原始指针设为shared_ptr之外,我还有其他选择吗? 最佳答案 这听起来有些不寻常并且可能非常危险,但是您可以通过在构造shared_ptr时使用无操作删除器来完成此操作:structno_op_delete{voidoperator()(void*){}};int*p=0

c++ - 在 shared_ptr 的容器上使用 C++ std::equal

我有一个std::shared_ptr的容器。我想使用std::equal比较两个容器。类A定义了operator==。我想使用其运算符==比较每个元素是否等效,而不是shared_ptr中定义的那个。我是否需要让一个函数或函数对象传递给equal?或者是否有一些内置的东西会更简单(比如中定义的东西)? 最佳答案 您将需要一个函数或一个函数对象或一个lambda表达式(因为您可以使用std::shared_ptr,所以您已经启用了C++0x的某些部分)。中没有任何内容帮助你,但有一些东西在提升:indirectiterator#in

c++ - 这是对 intrusive_ptr 的有效使用吗?

在我的代码中,当涉及到intrusive_ptrs时,我遵循两条规则:按值传递原始指针意味着保证原始指针在该函数的生命周期内有效。如果要在函数的生命周期之外存储和使用原始指针,则应将其存储在intrusive_ptr中。许多Internet评论者写道,shared_ptr应该比intrusive_ptr更受欢迎,除非使用第三方代码。但是,intrusive_ptr避免了传递智能指针,因为您可以从原始指针创建intrusive_ptr,就像在函数生命周期之外需要对象时一样。我只是担心我遗漏了一些东西,因为我读过的任何东西都没有说明有关intrusive_ptrs的观​​点,而且大多数人似