草庐IT

pimpl_ptr

全部标签

c++ - 创建包含已分配数组的 unique_ptr 的正确方法

创建一个unique_ptr的正确方法是什么,它包含一个在自由存储上分配的数组?VisualStudio2013默认支持这一点,但是当我在Ubuntu上使用gcc4.8.1版时,我会遇到内存泄漏和未定义的行为。这个问题可以用这段代码重现:#include#includeusingnamespacestd;intmain(){unique_ptrtestData(newunsignedchar[16000]());memset(testData.get(),0x12,0);return0;}Valgrind会给出这个输出:==3894==1errorsincontext1of1:==38

c++ - 如何使用 shared_ptr 避免内存泄漏?

考虑下面的代码。usingboost::shared_ptr;structB;structA{~A(){std::coutb;};structB{~B(){std::couta;};intmain(){shared_ptra(newA);shared_ptrb(newB);a->b=b;b->a=a;return0;}没有输出。没有调用析构函数。内存泄漏。我一直认为智能指针有助于避免内存泄漏。如果我需要在类中进行交叉引用,我应该怎么做? 最佳答案 如果你有这样的循环引用,一个对象应该持有weak_ptr到另一个,而不是shared_

c++ - 如何使用 shared_ptr 避免内存泄漏?

考虑下面的代码。usingboost::shared_ptr;structB;structA{~A(){std::coutb;};structB{~B(){std::couta;};intmain(){shared_ptra(newA);shared_ptrb(newB);a->b=b;b->a=a;return0;}没有输出。没有调用析构函数。内存泄漏。我一直认为智能指针有助于避免内存泄漏。如果我需要在类中进行交叉引用,我应该怎么做? 最佳答案 如果你有这样的循环引用,一个对象应该持有weak_ptr到另一个,而不是shared_

c++ - 我应该从使用 boost::shared_ptr 切换到 std::shared_ptr 吗?

我想通过-std=c++0x在GCC中启用对C++0x的支持。我不一定需要任何currentlysupportedC++11features在GCC4.5(很快4.6)中,但我想开始习惯它们。例如,在我使用迭代器的一些地方,auto类型会很有用。但同样,我不需要任何当前支持的功能。这里的目标是鼓励我将新标准的特性纳入我的编程“词汇表”。根据您对C++11支持的了解,在GCC中启用它是一个好主意,然后通过例如从使用boost::shared_ptr切换到std::shared_ptr因为两者不混合?PS:我知道thisgoodquestion它比较了shared_ptr的不同风格,但我要

c++ - 如何传递 std::unique_ptr ?

我第一次尝试使用C++11unique_ptr;我在我的一个项目中替换了一个多态原始指针,该指针归一个类所有,但传递的频率很高。我曾经有过这样的功能:boolfunc(BaseClass*ptr,intother_arg){boolval;//plainordinaryfunctionthatdoessomething...returnval;}但我很快意识到我无法切换到:boolfunc(std::unique_ptrptr,intother_arg);因为调用者必须处理函数的指针所有权,所以我不想这样做。那么,我的问题的最佳解决方案是什么?我虽然将指针作为引用传递,像这样:bool

c++ - 将 shared_ptr<Derived> 作为 shared_ptr<Base> 传递

通过shared_ptr的最佳方法是什么?将派生类型转换为采用shared_ptr的函数基本类型?我一般通过shared_ptrs通过引用避免不必要的复制:intfoo(constshared_ptr&ptr);但如果我尝试做类似的事情,这不起作用intfoo(constshared_ptr&ptr);...shared_ptrbar=make_shared();foo(bar);我可以使用foo(dynamic_pointer_cast(bar));但这似乎不是最理想的,原因有两个:一个dynamic_cast对于一个简单的派生到基础的转换来说似乎有点过分了。据我了解,dynamic

c++ - shared_ptr 和 weak_ptr 的区别

我正在阅读ScottMeyers“EffectiveC++”一书。有人提到有tr1::shared_ptr和tr1::weak_ptr就像内置指针一样,但它们会跟踪有多少tr1::shared_ptr指向一个对象。这称为引用计数。这可以很好地防止非循环数据结构中的资源泄漏,但是如果两个或多个对象包含tr1::shared_ptrs从而形成一个循环,则该循环可能会使彼此的引用计数保持在零以上,即使当所有指向循环的外部指针都已被销毁。这就是tr1::weak_ptrs的用武之地。我的问题是循环数据结构如何使引用计数高于零。我请求一个示例C++程序。weak_ptrs是如何解决问题的?(再次

c++ - unique_ptr 是否保证在 move 后存储 nullptr?

unique_ptr是否保证在move后存储nullptr?std::unique_ptrp1{newint{23}};std::unique_ptrp2{std::move(p1)};assert(!p1);//isthisalwaystrue? 最佳答案 可以,你可以在move之后和nullptr比较,保证比较相等。来自§20.8.1/4[unique.ptr]Additionally,ucan,uponrequest,transferownershiptoanotheruniquepointeru2.Uponcompletio

c++ - 如何声明 std::unique_ptr 以及它的用途是什么?

我试图了解std::unique_ptr的工作原理,为此我找到了this文档。作者从下面的例子开始:#include//declarationsofunique_ptrusingstd::unique_ptr;//defaultconstructionunique_ptrup;//createsanemptyobject//initializewithanargumentunique_ptruptr(newint(3));double*pd=newdouble;unique_ptruptr2(pd);//overloaded*and->*uptr2=23.5;unique_ptrups

c++ - 何时使用 shared_ptr 以及何时使用原始指针?

classB;classA{public:A():m_b(newB()){}shared_ptrGimmeB(){returnm_b;}private:shared_ptrm_b;};假设B是一个在语义上不应该存在于A生命周期之外的类,即B本身存在绝对没有意义。应GimmeB返回shared_ptr或B*?一般来说,完全避免在C++代码中使用原始指针代替智能指针是一种好习惯吗?我认为shared_ptr仅应在明确转让或共享所有权时使用,我认为在函数分配一些内存、用一些数据填充它并返回它并且调用者和被调用者之间存在理解的情况之外,这是非常罕见的前者现在对这些数据“负责”。