繁体   English   中英

std :: map中的智能指针

[英]smart pointer in the std::map

我定义了一个类myClass ,它的数据成员之一是

std::map<int,data*> dataMap

数据定义为

struct data
{
    int d1;
    int d2;
    std::string d3;
}

如下将数据插入到dataMap中: dataMap[key] = new data; 以下分配会导致问题:

myClass a1,a2;
//init a1;
a2 = a1;

我想对数据使用auto_ptr而不是data *。我该怎么做?-因为在销毁a2之后销毁“ a1数据的坏指针”存在问题。 std::map<int,std::auto_ptr<data> >编译有问题

UPD正如你建议我使用std :: shared_ptr的,但它还是引起了问题:在VS10

error C2440: 'delete' : cannot convert from 'std::tr1::shared_ptr<_Ty>' to 'void *'
1>          with
1>          [
1>              _Ty=data
1>          ]

您是否可以编写示例代码来指出使用shared_ptr的正确方法

通常,使用auto_ptr是一个坏主意(不建议使用),并且与标准容器结合使用时甚至更糟。

更喜欢设计更好的std::shared_ptrstd::unique_ptr取决于您的情况 ),您的代码将工作,但有一个例外:您需要在尝试将正确的智能指针类型插入容器时构造正确的智能指针类型,作为智能指针不能从原始指针隐式构造。

std::auto_ptr在容器中使用并不安全,这就是为什么不建议使用它的原因。 如果可用,请使用std::shared_ptrboost::shared_ptr

如果合适且可用,您也可以使用std::unique_ptr ,但这有点棘手。

如果您拥有唯一的所有权,则可以在C ++ 11中使用std::unique_ptr (即,该对象将永远不会共享,只有创建者才能再次销毁它),或者如果您已经共享,则可以使用std::shared_ptr所有权。

如果您使用的是C ++ 03,则可以改用boost::shared_ptrboost::unique_ptr

对于此错误:
error C2440: 'delete' : cannot convert from 'std::tr1::shared_ptr<_Ty>' to 'void *'
您无需删除shared_ptr的瞬间。 shared_ptr将使用参考计数器保存资源( new data ),并在参考计数器为0时自动将其删除,这意味着完全不使用资源。 有关详细信息,请参见shared_ptr手册

暂无
暂无

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

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