我已经定义了一个类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的示例代码
答案 0 :(得分:4)
使用auto_ptr
一般是个坏主意(已弃用),甚至更糟when combined with standard containers。
首选更好设计的std::shared_ptr
或std::unique_ptr
(depending on your situation),您的代码将使用一个例外:您需要在尝试将其插入其中时构造正确的智能指针类型容器,因为智能指针不能从原始指针隐式构造。
答案 1 :(得分:1)
std::auto_ptr
在容器中使用是不安全的,这就是它被弃用的原因。如果可用,请使用std::shared_ptr
或boost::shared_ptr
。
如果合适且可用,您也可以使用std::unique_ptr
,但这有点棘手。
答案 2 :(得分:1)
如果您拥有唯一的所有权(例如,该对象永远不会被共享且只有创建者可以再破坏它),您可以在C ++ 11中使用std::unique_ptr
,或者您可以使用std::shared_ptr
如果你有共享所有权。
如果您使用的是C ++ 03,则可以改为使用boost::shared_ptr
或boost::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