[英]Getting a boost::shared_ptr for this

I am making extensive use of boost:shared_ptr in my code. In fact, most of the objects that are allocated on the heap are held by a shared_ptr. Unfortunately this means that I can't pass this into any function that takes a shared_ptr. Consider this code:


void bar(boost::shared_ptr<Foo> pFoo)

void Foo::someFunction()

There are two problems here. First, this won't compile because the T* constructor for shared_ptr is explicit. Second, if I force it to build with bar(boost::shared_ptr<Foo>(this)) I will have created a second shared pointer to my object that will eventually lead to a double-delete.

这里有两个问题。首先,这不会编译,因为shared_ptr的T*构造函数是显式的。其次,如果我强制它使用bar(boost: shared_ptr (this)))构建,我将创建第二个指向对象的共享指针,最终将导致双删除。

This brings me to my question: Is there any standard pattern for getting a copy of the existing shared pointer you know exists from inside a method on one of those objects? Is using intrusive reference counting my only option here?


6 个解决方案



You can derive from enable_shared_from_this and then you can use "shared_from_this()" instead of "this" to spawn a shared pointer to your own self object.


Example in the link:


#include <boost/enable_shared_from_this.hpp>

class Y: public boost::enable_shared_from_this<Y>

    shared_ptr<Y> f()
        return shared_from_this();

int main()
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership

It's a good idea when spawning threads from a member function to boost::bind to a shared_from_this() instead of this. It will ensure that the object is not released.




Just use a raw pointer for your function parameter instead of the shared_ptr. The purpose of a smart pointer is to control the lifetime of the object, but the object lifetime is already guaranteed by C++ scoping rules: it will exist for at least as long as the end of your function. That is, the calling code can't possibly delete the object before your function returns; thus the safety of a "dumb" pointer is guaranteed, as long as you don't try to delete the object inside your function.


The only time you need to pass a shared_ptr into a function is when you want to pass ownership of the object to the function, or want the function to make a copy of the pointer.




boost has a solution for this use case, check enable_shared_from_this




Are you really making more shared copies of pFoo inside bar? If you aren't doing anything crazy inside, just do this:


void bar(Foo &foo)
    // ...



With C++11 shared_ptr and enable_shared_from_this is now in the standard library. The latter is, as the name suggests, for this case exactly.

使用c++ 11 shared_ptr和enable_shared_from_this现在在标准库中。后者,顾名思义,就是针对这种情况。





Example bases on that in the links above:


struct Good: std::enable_shared_from_this<Good>{
    std::shared_ptr<Good> getptr() {
        return shared_from_this();



std::shared_ptr<Good> gp1(new Good);
std::shared_ptr<Good> gp2 = gp1->getptr();
std::cout << "gp2.use_count() = " << gp2.use_count() << '\n';



The function accepting a pointer wants to do one of two behaviors:


  • Own the object being passed in, and delete it when it goes out of scope. In this case, you can just accept X* and immediately wrap a scoped_ptr around that object (in the function body). This will work to accept "this" or, in general, any heap-allocated object.
  • 拥有传入的对象,并在对象超出范围时删除它。在这种情况下,您可以只接受X*,并立即在该对象(在函数体中)包围一个scoped_ptr。这将工作于接受“This”或一般地接受任何堆分配的对象。
  • Share a pointer (don't own it) to the object being passed in. In this case you do not want to use a scoped_ptr at all, since you don't want to delete the object at the end of your function. In this case, what you theoretically want is a shared_ptr (I've seen it called a linked_ptr elsewhere). The boost library has a version of shared_ptr, and this is also recommended in Scott Meyers' Effective C++ book (item 18 in the 3rd edition).
  • 向被传入的对象共享一个指针(不要拥有它)。在这种情况下,您根本不想使用scoped_ptr,因为您不想在函数的末尾删除对象。在这种情况下,理论上需要的是shared_ptr(我在别处见过它被称为linked_ptr)。boost库有shared_ptr的一个版本,这在Scott Meyers的有效c++书籍(第3版第18项)中也得到了推荐。

Edit: Oops I slightly misread the question, and I now see this answer is not exactly addressing the question. I'll leave it up anyway, in case this might be helpful for anyone working on similar code.





© 2014-2019 ITdaan.com 粤ICP备14056181号