草庐IT

pimpl_ptr

全部标签

C++ shared_ptr 释放所有权

这个问题在这里已经有了答案:Moveownershipfromstd::shared_ptrtostd::unique_ptr(1个回答)关闭7年前。我们都知道在C++中我们可以很容易地将unique_ptr转换为shared_ptr。但是,如果我进行了这样的转换怎么办:-unique_ptru=make_unique();//Xissomeclassshared_ptrs=move(u);//thisworksofcourse现在我想将s中指针的所有权转移回u。遗憾的是,shared_ptr中没有像unique_ptr中那样的release()函数,否则我可能不会这样做:-u.res

c++ - 在公共(public)成员函数中返回私有(private) unique_ptr

考虑以下类原型(prototype):classObjHandler{std::unique_ptrGetPtr(){returnobj;}private:std::unique_ptrobj;};这会生成一个编译时错误,说明std::unique_ptr的复制构造函数已被删除。为什么这里不应用移动语义?是否与GetPtr()不拥有obj指针有关?我应该如何实现我的代码(我需要一个成员函数以最小的开销返回一个指向流的拥有指针)? 最佳答案 unique实际上意味着“独特的所有权”。创建所有权的拷贝是没有意义的,因为那样它就不再是唯一

c++ - 数据结构是否适合放置 shared_ptr?

我正在用C++实现二叉树。传统上,我会有一个指向左的指针和一个指向右的指针,但手动内存管理通常以泪水告终。这引出了我的问题......数据结构是否适合使用shared_ptr? 最佳答案 我认为这取决于您将在哪里使用它们。我假设你想做的是这样的:templateclassBinaryTreeNode{//publicinterfaceignoredforthisexampleprivate:shared_ptr>left;shared_ptr>right;Tdata;}如果您希望您的数据结构能够处理动态创建的节点,这将非常有意义。但

c++ - boost::shared_ptr 需要单个头文件

Boost::shared_ptr真的很棒。但是使用它你需要很多头文件。是否有任何单个头文件可以提供shared_ptr功能?有点急。 最佳答案 如果你想避免拥有所有的boost头文件,尽管你只使用了shared_ptr,你可以使用BCP提取shared_ptr:http://www.boost.org/doc/libs/1_36_0/tools/bcp/bcp.html虽然它不会给你一个头文件,但我怀疑这会给你带来任何明显的优势。 关于c++-boost::shared_ptr需要单个

c++ - 将 auto_ptr 传递给函数可以有效地使其成为接收器。为什么?

我正在阅读一些关于共享指针的笔记。他们说STL对auto_ptr的第一次尝试有以下主要缺点:不能在STL容器中使用复制auto_ptr转移所有权将auto_ptr传递给函数有效地使其成为接收器我理解前两个,但不确定最后一个是什么意思。谁能解释一下。谢谢。 最佳答案 这是因为一旦将auto_ptr复制到一个变量中,您就失去了指向新变量的指针的所有权。当你有:voidfoo(std::auto_ptrx);并且您使用auto_ptr调用foo,您为foo复制了一份auto_ptr采用。这有效地将所有权转移到foo,因此指针在foo完成后

c++ - 我可以在不更改 use_count 的情况下将 shared_ptr<T> & 转换为 shared_ptr<T const> & 吗?

我有一个使用boost::shared_ptr的程序s,特别是依赖于use_count的准确性执行优化。例如,假设一个加法运算有两个参数指针lhs和rhs。假设他们都有类型shared_ptr.当需要执行加法时,我会检查use_count,并且如果我发现其中一个参数的引用计数恰好为1,那么我将重新使用它来就地执行操作。如果两个参数都不能重用,我必须分配一个新的数据缓冲区并执行异地操作。我正在处理庞大的数据结构,因此就地优化非常有用。因此,我永远无法复制shared_ptr没有理由,即每个函数都采用shared_ptrs通过引用或const引用以避免扭曲use_count.我的问题是:我

c++ - std::move(std::unique_ptr()) 组合是否有标准缩写?

我终于要将我的代码库迁移到C++11,这会产生更短更好的代码。但是我发现当我用一个新的指针调用函数时,它比以前长了很多:voidaddCallback(Callback*);//Takesownershipofcallback.//...addCallback(newCallback);//Clear.成为voidaddCallback(std::unique_ptr);//Nocommentneedednow!//...addCallback(std::move(std::unique_ptr(newCallback)));//bleh.提议的make_unique()模板函数只会在

c++ - std::static_pointer_cast 与 static_cast<std::shared_ptr<A>>

我有一个类层次结构,其中B源自A像这样:classA:publicstd::enable_shared_from_this{};classB:publicA{voidf(){//thecodebelowcompilesstd::shared_ptrcopyOfThis=std::static_pointer_cast(shared_from_this());//thecodebelowdoesnotstd::shared_ptrcopyOfThis=static_cast>(std::make_shared(shared_from_this()));}};所以实际上我想了解为什么我不能

c++ - shared_ptr 会自动释放内存吗?

我需要在这里使用shared_ptr,因为我无法更改API。Foo1*foo1=newFoo1(...);shared_ptrfoo2(foo1);这里的shared_ptr是否要处理释放foo1使用的内存?如果我理解正确,我不应该在foo1上调用delete,对吗? 最佳答案 是的。你是对的,但是初始化的正确方法foo2是:std::shared_ptrfoo2=std::make_shared();HerbSutter讨论了您应该使用std::make_shared()的原因这里:https://herbsutter.com/2

c++ - auto_ptr、immediate get() 和 release()——有用吗?

我正在处理别人的代码,其中包含很多这样的语句std::auto_ptrsmartptr(newObjectA(this));objects_list.push_back(smartptr.get());smartptr.release();这个有用吗?在这里使用智能指针而不是仅仅写有什么实际原因吗?objects_list.push_back(newObjectA(this)); 最佳答案 objects_list.push_back(newObjectA(this));这可能会泄漏内存。让我们看看当我们分解它时会发生什么:newO