2011-11-26 63 views
0

我知道你必须小心自动指针(以及为什么),特别是STL。但我没有看到这个问题:在std :: map中使用std :: auto_ptr安全吗?

std::map<T1, std::auto_ptr<T2> >; 

这是安全吗?


我看到它是如何在std::vector突破,因为它有它的项目从时间复制到时间,但是这也适用于一个std::map的值类型?


编辑:很显然,无论它是安全的,我不能(在技术上)填充地图,但我会留下开放的理论思考的问题。否则,请考虑关闭它。

回答

2

这不是安全的。从技术上来说,std::auto_ptr不符合CopyConstructible可分配的要求,因为使用auto_ptr的复制构造函数或复制赋值运算符制作的副本与复制操作后的副本源不相同。对于任何标准容器使用的任何类型,必须满足这些要求。

你会发现你会得到你所期望的一个实现,一个特定使用时的行为,但如果你违反了容器的要求,你不能指望你的代码在所有情况下工作。

0

还没安全。如果没有别的,你第一次从地图上检索指针,你会转移所有权,并使其无效。

有一个非常狭窄的有效使用情况的auto_ptr。我能记得的唯一一件事是,当一个对象想明确表明它拥有一个指针的所有权和责任时,它就会交给它。

+5

是否在地图上没有元素访问返回*参考*的值类型?即'std :: auto_ptr &'。这不会创建一个新的'auto_ptr'对象。 – bitmask

+0

但很多时候程序员往往接受复制的返回值(int值= MYMAP [关键]),如果该值类型是auto_ptr的 – zienkikk

+1

如果*总*直接使用引用或分配给将转移所有权引用,包括函数参数,宏,初始化等等,那么只要std :: map的实现没有什么奇怪,那也可能是好的。这是我的记忆和警惕的更多负担,我会选择采用auto_ptr的可疑好处,当有其他选择时,如TR1智能指针或Boost。 – Nialscorva