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> ]