C++ std::map中的智能指针

C++ std::map中的智能指针,c++,map,smart-pointers,assign,auto-ptr,C++,Map,Smart Pointers,Assign,Auto Ptr,我定义了一个类myClass,它的一个数据成员是 std::map<int,data*> dataMap 将数据插入dataMap的操作如下:dataMap[key]=新数据 以下分配导致了一个问题: myClass a1,a2; //init a1; a2 = a1; 我想对数据使用auto_ptr,而不是数据*。我该怎么做- 因为在a2被销毁后,销毁“a1数据的坏指针”有问题。std::map编译时有问题 Upd正如您建议的,我使用std::shared\u ptr,但它仍然

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

std::map<int,data*> dataMap
将数据插入dataMap的操作如下:
dataMap[key]=新数据
以下分配导致了一个问题:

myClass a1,a2;
//init a1;
a2 = a1;
我想对数据使用auto_ptr,而不是数据*。我该怎么做- 因为在a2被销毁后,销毁“a1数据的坏指针”有问题。
std::map
编译时有问题

Upd正如您建议的,我使用std::shared\u ptr,但它仍然会导致以下问题: 在
VS10中

error C2440: 'delete' : cannot convert from 'std::tr1::shared_ptr<_Ty>' to 'void *'
1>          with
1>          [
1>              _Ty=data
1>          ]
错误C2440:'delete':无法从'std::tr1::shared_ptr'转换为'void*'
1> 与
1>          [
1> _Ty=数据
1>          ]

您能否编写示例代码,指出使用共享ptr的正确方法使用
自动ptr
通常是一个坏主意(不推荐使用),甚至更糟


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

使用
auto\u ptr
通常是个坏主意(不推荐使用),甚至更糟


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

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


如果合适和可用,您也可以使用
std::unique\u ptr
,但它有点棘手。

std::auto\u ptr
在容器中使用不安全,这就是它被弃用的原因。如果可用,请使用
std::shared_ptr
boost::shared_ptr


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

如果您拥有唯一的所有权,您可以在C++11中使用
std::unique_ptr
(即,对象永远不会被共享,只有创建者可以再次销毁)如果您拥有共享所有权,也可以使用
std::shared_ptr


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

如果您拥有唯一的所有权,您可以在C++11中使用
std::unique_ptr
(即,对象永远不会被共享,只有创建者可以再次销毁)如果您拥有共享所有权,也可以使用
std::shared_ptr


如果您使用的是C++03,则可以使用
boost::shared_ptr
boost::unique_ptr
来代替。

对于此错误:
错误C2440:“delete”:无法从“std::tr1::shared_ptr”转换为“void*”


您不需要删除一瞬间的共享\u ptr。共享的ptr将用一个引用计数器保存资源(新数据
),并在引用计数器为0时自动删除它,这意味着资源根本没有被使用。有关此错误的详细信息,请参见:
错误C2440:“删除”:无法从“std::tr1::shared\u ptr”转换为“void*”


您不需要删除一瞬间的共享\u ptr。共享的ptr将用一个引用计数器保存资源(新数据
),并在引用计数器为0时自动删除它,这意味着资源根本没有被使用。有关详细信息,请参见

您使用的是C++03还是C++11?不要使用
auto\u ptr
,如果您可以访问C++11,请使用
std::unique\u ptr
std::shared\u ptr
,否则请使用
boost::shared\u ptr
。您使用的是C++03还是C++11?如果您可以访问C++11,请不要使用
auto ptr
,使用
std::unique\u ptr
std::shared\u ptr
,否则返回使用
boost::shared\u ptr
error C2440: 'delete' : cannot convert from 'std::tr1::shared_ptr<_Ty>' to 'void *'
1>          with
1>          [
1>              _Ty=data
1>          ]