sebastiangeiger
sebastiangeiger

Reputation: 3416

Smart pointer that does transfer of ownership and is not shared when C++11 is not an option

Currently I am solving my problem with boost::shared_ptr but the semantics is not quite right, since I am "transplanting" members from one object to another. I was looking through this list but it didn't yield too much. Same goes for my brief google searches.

Essentially I am looking for a unique_ptr implementation that works with my gcc4.2 (Hence the restriction to not use C++11)

Upvotes: 2

Views: 1591

Answers (6)

bond
bond

Reputation: 1

boost::shared_ptr with custom deleter.

This is something I used in unit test to simulate Corba _var class behaviour.

struct CondDel {
  bool doDel;
  CondDel() : doDel(true) {
  }
  template<typename T>
  void operator()(T* p) {
    if (doDel)
      delete p;
  }
};
class MyCorbaObj_var : public boost::shared_ptr<_objref_MyCorbaObj> {
public:
  MyCorbaObj_var(_objref_MyCorbaObj* p) : boost::shared_ptr<_objref_MyCorbaObj>(p, CondDel()) {
  }
  _objref_MyCorbaObj* _retn() {
    CondDel* cd = (CondDel*)_internal_get_deleter(typeid(CondDel));
    cd->doDel = false;
    return get();
  }
};

Upvotes: 0

Kevin Hopps
Kevin Hopps

Reputation: 727

If you want copying objects of your class to make new copies of the pointed-to items, then no kind of pointer (auto_ptr, shared_ptr or naked pointer) will do what you want without some extra work on your part. You will need to manage the copying yourself. Be sure you implement a copy constructor and assignment operator so that they clone the pointed-to items and store the new pointers in the destination object. If you do this, auto_ptr and shared_ptr will both work just fine for you.

Upvotes: -1

sehe
sehe

Reputation: 394054

You could stick with std::auto_ptr until Boost implements unique_ptr on top of the new Boost Move library (C++03 compatible).

See this mailing list traffic d.d. November 10th 2011: http://boost.2283326.n4.nabble.com/smart-ptr-Inclusion-of-unique-ptr-td4021667.html

Edit And Boost Interprocess has a uniqe_ptr<> class template floating around:

Upvotes: 7

Abyx
Abyx

Reputation: 12928

llvm::OwningPtr - it has take method to take ownership.

Upvotes: 1

Bj&#246;rn Pollex
Bj&#246;rn Pollex

Reputation: 76886

Depending on what exactly you want, you might consider using boost::scoped_ptr. It is very similar to std::unique_ptr, but it cannot be moved (because C++03 doesn't know about move-semantics). It can, however be swapped. So, when you want to transfer ownership, just do this:

boost::scoped_ptr<T> dummy;
dummy.swap(my_ptr);
// now you have basically transferred ownership from my_ptr to dummy

Upvotes: 3

Simon
Simon

Reputation: 1504

Use std::auto_ptr<..>, it has exactly what you need.

Upvotes: 1

Related Questions