std :: map中的智能指针

时间:2013-02-20 11:03:01

标签: c++ map smart-pointers assign auto-ptr

我已经定义了一个类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用于数据而不是数据*。我这样做吗? - 因为在a2被破坏后破坏“a1数据的坏指针”有问题。std::map<int,std::auto_ptr<data> >编译有问题

更新正如您所建议我使用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的示例代码

4 个答案:

答案 0 :(得分:4)

使用auto_ptr一般是个坏主意(已弃用),甚至更糟when combined with standard containers

首选更好设计的std::shared_ptrstd::unique_ptrdepending on your situation),您的代码将使用一个例外:您需要在尝试将其插入其中时构造正确的智能指针类型容器,因为智能指针不能从原始指针隐式构造。

答案 1 :(得分:1)

std::auto_ptr在容器中使用是不安全的,这就是它被弃用的原因。如果可用,请使用std::shared_ptrboost::shared_ptr

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

答案 2 :(得分:1)

如果您拥有唯一的所有权(例如,该对象永远不会被共享且只有创建者可以再破坏它),您可以在C ++ 11中使用std::unique_ptr,或者您可以使用std::shared_ptr如果你有共享所有权。

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

答案 3 :(得分:1)

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