简体   繁体   English

从原始指针创建shared_ptr

[英]Creating shared_ptr from raw pointer

I have a pointer to an object. 我有一个指向对象的指针。 I would like to store it in two containers which both have the ownership. 我想将它存放在两个拥有所有权的容器中。 So I think I would be good to make it a shared_ptr of C++0x. 所以我认为我很高兴它成为C ++ 0x的shared_ptr。 How could I convert a raw pointer to a shared_pointer? 我怎么能将原始指针转换为shared_pointer?

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

Thanks 谢谢

You need to make sure you don't initialize both shared_ptr objects with the same raw pointer, or it will be deleted twice. 您需要确保不使用相同的原始指针初始化两个shared_ptr对象,否则它将被删除两次。 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. raw_ptr根本不应该作为变量存在。 If you directly initialize your smart pointers with the result of new , you reduce your risk of accidentally initializing other smart pointers incorrectly. 如果直接使用new的结果初始化智能指针,则可以降低意外初始化其他智能指针的风险。 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: 您可以使用多种方式,但reset()会很好:

map1[ID].reset(obj);

And to address the issue of having two maps refer to the same shared_ptr, we can have: 要解决两个映射引用同一个shared_ptr的问题,我们可以:

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. 而是将新的堆对象直接放入shared_ptr中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM