【问题标题】:Is there a contradiction between these two sources about the `auto_ptr` template class?关于 `auto_ptr` 模板类的这两个来源之间是否存在矛盾?
【发布时间】:2012-02-20 11:56:22
【问题描述】:

site 声明“所有权、来源和汇”:

“当您复制auto_ptr 时,您会自动将所有权从源auto_ptr 转移到目标auto_ptr如果目标auto_ptr 已经拥有一个对象,则首先释放该对象。复制后,只有目标auto_ptr拥有指针,并在适当的时候将其删除,而源被设置回空状态,不能再用于引用拥有的对象。".

现在考虑templacte<classX> class auto_ptroperator=() 的定义,在 Stroustrup 的C++ 编程语言第三版的第 14 章第 368 页:

auto_ptr& operator=(auto_ptr& a) throw() { ptr = a.ptr; a.ptr = 0; }

我看不到操作员释放ptr 寻址的对象,以防ptr != 0

【问题讨论】:

  • 还有一些可疑的地方:operator= 没有返回任何东西。
  • @sbi C++ 编程语言第三版
  • ptr 的类型是什么?是 classX* 还是 auto_ptr_guts<classX> ?如果是后者,上面的代码就很简单了。

标签: c++ auto-ptr


【解决方案1】:

是的,这绝对是后一段代码中的一个错误。 ptr指向的对象必须是deleted才能给ptr赋值,否则ptr原来指向的对象会被泄露。

【讨论】:

  • 奇怪的是,即使在勘误表 (www2.research.att.com/~bs/3rd_printing5.html) 中也没有提到删除。
  • @sharptooth:尤其是未使用的代码库 - 并不是说​​ C++PL 中的代码是从 auto_ptr 的生产实现的存储库中自动提取的。
猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多