从原始指针创建 share_ptr

我有一个指向对象的指针。我想把它放在两个集装箱里,两个集装箱都有所有权。因此,我认为最好将它设置为 C + + 0x 的 share _ ptr。如何将一个原始指针转换成一个 share _ point?

typedef unordered_map<string, shared_ptr<classA>>MAP1;
MAP1 map1;
classA* obj = new classA();
map1[ID] = how could I store obj in map1??

谢谢

137142 次浏览

You need to make sure you don't initialize both shared_ptr objects with the same raw pointer, or it will be deleted twice. A better (but still bad) way to do it:

classA* raw_ptr = new classA;
shared_ptr<classA> my_ptr(raw_ptr);


// or shared_ptr<classA> my_ptr = raw_ptr;


// ...


shared_ptr<classA> other_ptr(my_ptr);
// or shared_ptr<classA> other_ptr = my_ptr;
// WRONG: shared_ptr<classA> other_ptr(raw_ptr);
// ALSO WRONG: shared_ptr<classA> other_ptr = raw_ptr;

WARNING: the above code shows bad practice! raw_ptr simply should not exist as a variable. If you directly initialize your smart pointers with the result of new, you reduce your risk of accidentally initializing other smart pointers incorrectly. What you should do is:

shared_ptr<classA> my_ptr(new classA);


shared_ptr<classA> other_ptr(my_ptr);

What's nice is that the code is more concise as well.

EDIT

I should probably elaborate on how it would work with a map. If you had a raw pointer and two maps, you could do something similar to what I showed above.

unordered_map<string, shared_ptr<classA> > my_map;
unordered_map<string, shared_ptr<classA> > that_guys_map;


shared_ptr<classA> my_ptr(new classA);


my_map.insert(make_pair("oi", my_ptr));
that_guys_map.insert(make_pair("oi", my_ptr));
// or my_map["oi"].reset(my_ptr);
// or my_map["oi"] = my_ptr;
// so many choices!

You can use a variety of ways, but reset() would be good:

map1[ID].reset(obj);

And to address the issue of having two maps refer to the same shared_ptr, we can have:

map2[ID] = map1[ID];

Note that the trick in general to avoid a double delete is to try to avoid raw pointers at all. Hence avoid:

classA* obj = new classA();
map1[ID].reset(obj);

but instead put the new heap object straight into a shared_ptr.