【问题标题】:Difference between pointer and smart pointer指针和智能指针的区别
【发布时间】:2010-10-03 19:54:22
【问题描述】:

你能告诉我这段代码有什么问题吗?我在面试中被问到这个问题,我不确定它有什么问题

tClass 是一个带有 printSomething 方法的测试类,它打印 tClass 的成员。

tClass * A = new tClass();
f(A);
A->printSomething();

auto_ptr<tClass> * B = new tClass();
f(B);
B-> printSomething();

或者这是一个技巧问题。

【问题讨论】:

  • 这听起来很愚蠢:函数 f() 是什么?
  • 太添加到 ChrisW,f 可能不接受 auto_ptr 参数,auto_ptr 不转换为本机指针,所以你需要 f(B.get())
  • 如果 f 是 template &lt;typename T&gt; void f(T ptr) { ptr-&gt;printSomething(); } 怎么办?
  • @TokenMacGuy 甚至可能有两个fs:重载。

标签: c++ auto-ptr


【解决方案1】:

auto_ptr 是一种智能指针,它在只有一方拥有指针的前提下运行,如果该拥有方超出范围,则指针将被删除。

当您将 auto_ptr 传递给函数时,您就是在“给”函数该指针,因此您不再拥有它。当你取消引用它时,你会得到一个空指针行为(当然,这是未定义的)。

不过,为了让你的代码能够编译,你必须稍微改变一下B 的定义,它应该是

auto_ptr<tClass> B = new tClass;

因为 auto_ptr 不是类型(它是类型模板),并且您实际上根本不需要指向该类型的指针,因为该类重载了这些行为。

【讨论】:

  • 您可能想提一下 auto_ptr 已被 unique_ptr 取代:stackoverflow.com/questions/2404115/is-auto-ptr-deprecated。另外,tClass 后面的括号真的需要吗?
  • @ArunSaha:它还没有被弃用。 C++0x 还不是标准 :)
  • "当您将 auto_ptr 传递给函数时..." 仅适用于按值传递; f() 可能接受对 auto_ptr 的引用。
【解决方案2】:

有什么问题:

  • A 永远不会被删除。
  • f 未声明。
  • B 应该是auto_ptr&lt;tClass&gt; 类型。
  • new tClass() 属于 tClass* 类型,这不是分配给 B 的正确类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2017-04-29
    相关资源
    最近更新 更多