草庐IT

C++11 通过原始指针或引用获取 unique_ptr 的所有权?

编辑我想下面的代码会假设我有一个addChild()的重载版本,它接受一个已经包装在unique_ptr中的Sprite,在那里取得所有权就可以了。只是想我会在其他人之前提到这一点。:)。经过漫长的一天,我在这里编写了所有代码,因此请将其视为伪代码质量,仅用于演示手头的问题。原始问题我正在编写一个框架,其中有一个显示列表、parent/child等。我认为使用unique_ptrforexample是这里的方法,因为当您将子项添加到父显示对象时,父项现在成为该子项的唯一所有者是合乎逻辑的。但是,将有可用的方法,例如getChildAt(index)和getChildByName等,我认

c++ - 为什么使用 shared_ptr 创建弱指针?

我写了以下简单的代码,#include#includestructFoo{Foo(){std::coutp1(newFoo);//thislinep1->bar();std::shared_ptrp2(p1);}然后在监window口中,我得到了,p2std::__1::shared_ptrptr=0x100104350strong=2weak=1p1std::__1::shared_ptrptr=0x100104350strong=2weak=1现在,我能理解strong=2,但为什么weak=1呢?其次,在代码中我将代码更改为,std::shared_ptrp1(std::move

c++ - 为什么 unique_ptr<T>::~unique_ptr 需要 T 的定义?

如果我有一个“酒吧”类://bar.hclassBar{public:Bar(){}};我转发声明与另一个类“Foo”中的std::unique_ptr一起使用://foo.h#includeclassBar;classFoo{public:Foo();private:std::unique_ptrbar_;};我在Foo的实现文件中包含了它的定义://foo.cpp#include"foo.h"#include"bar.h"Foo::Foo():bar_(newBar){}我收到编译时错误“‘sizeof’对不完整类型‘Bar’的无效应用”。我从here了解到和here为了解决这个问

c++ - 为什么类的方法不能访问我类的某些字段?

我尝试执行linked_ptr.这是一项学习任务。这是我的代码的一部分:templateclasslinked_ptr{public://***************linked_ptr(linked_ptrconst&other){p=other.p;left_ptr=&other;right_ptr=other.right_ptr;if(other.right_ptr!=nullptr){(other.right_ptr)->left_ptr=this;}other.right_ptr=this;}templatelinked_ptr(linked_ptrconst&other)

c++ - 如何将 unique_ptr 移出 vector<unique_ptr<Foo>>?

我想搬一个unique_ptr从一个vector>.考虑我的代码:#include#include#includeusingnamespacestd;classFoo{public:intx;Foo(intx):x(x){};~Foo(){cout>();foos.push_back(unique_ptr(newFoo(100)));foos.push_back(unique_ptr(newFoo(101)));foos.push_back(unique_ptr(newFoo(102)));//Printallcoutxxx我预计它会产生:Vectorsize:3100101102Re

c++ - 在递归数据结构中 move unique_ptr<T> 数组

尝试编译以下代码会导致以下编译错误:errorC2280:'std::unique_ptr>::unique_ptr(conststd::unique_ptr>&)':attemptingtoreferenceadeletedfunction我的理解是数组“m_children”应该是可move的,因为unique_ptr指向的类型定义了move构造函数。除非这是由类的递归性质或我忽略的某些move语义元素引起的错误?#include#include#includeclassOctreeNode{public:OctreeNode(){};OctreeNode(OctreeNode&&

c++ - 如果在 user.hpp 中定义了 BOOST_NO_EXCEPTIONS,为什么不能编译 boost::shared_ptr

我有一个嵌入式系统,想在这个系统中使用boost,但需要禁用异常,因为我不想支付异常成本。boost给了一个user.hpp和可设置的宏选项BOOST_NO_EXCEPTIONS和BOOST_NO_EXCEPTION_STD_NAMESPACE,但是boost::shared_ptr不能编译(更准确的说,不能链接)如果定义了这两个宏。shared_ptr_boost.cpp:(.text._ZN5boost6detail12shared_countC2IiEEPT_[_ZN5boost6detail12shared_countC5IiEEPT_]+0x7a):undefinedrefe

c++ - smart_ptr 到类段错误的属性

我想知道这个例子是否会导致段错误,因为对象的dtor被调用了,我仍然持有指向对象属性的shared_ptr。structfoo{std::shared_ptrconstbar=std::make_shared("foo");foo(){std::coutptr;{std::shared_ptrfoo_ptr=std::make_shared();ptr=foo_ptr->bar;}std::cout 最佳答案 不,它不会。通过将std::shared_ptr分配给另一个,您可以阻止它死亡。此操作ptr=foo_ptr->bar;会将

c++ - *(ptr)[j++] 的替代符号?

在将双指针传递给函数时,我在函数中使用了符号*ptr[j++],这导致程序崩溃。我猜它是由于运算符优先级而发生的,所以我通过编写(*ptr)[j++]来纠正它,但我不喜欢这种表示法。感觉又长又乱。我也知道符号ptr[0][j++]但我也不喜欢它。有没有更好的符号或方法来解决所有这些问题?我的代码:#includeusingnamespacestd;voidmset(int**ptr,size_tsize);voidmain(void){constsize_tsize=10;int*ptr=newint[size];mset(&ptr,size);for(size_tn=0;nP.S我知

c++ - 将 make_unique<X> 分配给 shared_ptr<X>

我(错误地)在我的程序中进行了以下分配:std::shared_ptrm_program;//inclassm_program=std::make_unique();//inmethod当我发现它时,我首先想知道为什么它甚至可以编译。事实证明,shared_ptr对unique_ptr对象有一个特殊的移动赋值运算符。我的问题是,这样做是否总是安全的,或者它有任何影响吗?(对于代码执行来说是安全的;对于代码审查来说显然是不安全的……) 最佳答案 从某种意义上说,这样做是“安全的”,您不会遇到任何重复删除或其他问题。这样做是不行的,因为