在std::map中使用std::auto_ptr安全吗?
Is it safe to use std::auto_ptr in std::map?
我知道您必须小心使用自动指针(以及为什么),特别是使用STL。但是我看不出这个有什么问题:
std::map<T1, std::auto_ptr<T2> >;
这安全吗?
我看到它是如何在std::vector
中中断的,因为它必须不时地复制它的项,但是对于std::map
的值类型也是如此吗?
编辑:显然,不管它是否安全,我都不能(技术上)填充地图,但我将把这个问题留给理论考虑。
不安全。从技术上讲,std::auto_ptr
不满足CopyConstructible或Assignable的要求,因为使用auto_ptr
的复制构造函数或拷贝赋值操作符所做的拷贝在拷贝操作后并不等于拷贝的源。对于与任何标准容器一起使用的任何类型,都必须满足这些要求。
你可能会发现你似乎得到了一个特定用例的一个实现的行为,但是如果你违反了容器的要求,你就不能指望你的代码在所有情况下都能工作。
仍然不安全。如果不出意外,第一次从映射中检索指针时,您将转移所有权并使其无效。
auto_ptr有一个非常狭窄的有效用例。我记得遇到的唯一一个是当一个对象想要明确地表明它对你交给它的指针拥有所有权和责任。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- 引用 std::shared:ptr 以避免引用计数
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 使用std :: String ptr的错误打印std :: String
- C++中的大小释放:全局运算符delete的正确行为是什么(void*ptr,std::size_t size)
- std::哈希表示无序映射中的唯一 PTR
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- 正确使用std智能指针以确保ptr安全
- 如何创建 std::string 包装器,它将 ptr 保留为 std::string 和 ptr 到创建该包装器实例的
- 为什么 std::string{ "const char ptr" } 有效?
- 为什么 gcc 4.9.0 中没有定义"void operator delete(void* ptr, std::size_t size) noexcept;"?
- 在 std::map 的值中使用非 ptr 是一种很好的做法吗
- 共享 PTR - C++:std::shared_ptr<T> 和 std::shared_ptr<T const> 有什么区别?