在std::map中使用std::auto_ptr安全吗?

Is it safe to use std::auto_ptr in std::map?

本文关键字:std ptr 安全 map auto      更新时间:2023-10-16

我知道您必须小心使用自动指针(以及为什么),特别是使用STL。但是我看不出这个有什么问题:

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

这安全吗?


我看到它是如何在std::vector中中断的,因为它必须不时地复制它的项,但是对于std::map的值类型也是如此吗?


编辑:显然,不管它是否安全,我都不能(技术上)填充地图,但我将把这个问题留给理论考虑。

不安全。从技术上讲,std::auto_ptr不满足CopyConstructibleAssignable的要求,因为使用auto_ptr的复制构造函数或拷贝赋值操作符所做的拷贝在拷贝操作后并不等于拷贝的源。对于与任何标准容器一起使用的任何类型,都必须满足这些要求。

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

仍然不安全。如果不出意外,第一次从映射中检索指针时,您将转移所有权并使其无效。

auto_ptr有一个非常狭窄的有效用例。我记得遇到的唯一一个是当一个对象想要明确地表明它对你交给它的指针拥有所有权和责任。