2010-10-03 147 views
1

你能告诉我这段代码有什么问题吗?我被问这个在接受采访时,我不知道什么地方错了指针和智能指针的区别

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

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

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

或这是一个诡计的问题。

+3

这可能听起来愚蠢:什么是函数f()? – beta0x64 2010-10-03 19:59:36

+1

太添加到ChrisW,'F'可能不接受'auto_ptr'参数和'auto_ptr'不转换为原生指针,所以你需要'F(B.get())'。 – Potatoswatter 2010-10-03 20:04:03

+1

如果f是'template void f(T ptr){ptr-> printSomething(); }'? – SingleNegationElimination 2010-10-03 20:09:16

回答

6

auto_ptr的是一种智能指针的那恰好一方拥有指针的前提下进行操作的正确类型的,并且如果拥有它派对超出范围,指针被删除。

当你传递一个auto_ptr的功能,你是“给予”的功能指针,所以你不要它了。当你解引用它时,你会得到一个空指针行为(当然这是未定义的)。

为了让你的代码进行编译,但是,你必须改变你的B定义了一下,应该是

auto_ptr<tClass> B = new tClass; 

因为auto_ptr的是不是一个类型(其类型模板),和你实际上并不需要一个指向该类型的指针,因为类会重载这些行为。

+1

可能是要提的是'auto_ptr'是赞成'unique_ptr'的弃用:http://stackoverflow.com/questions/2404115/is-auto-ptr-deprecated。另外,'tClass'真的需要一对圆括号吗? – Arun 2010-10-03 22:40:05

+1

@ArunSaha:它不被弃用*尚未*。 C++ 0x尚未标准:) – jalf 2010-10-03 22:59:05

+1

“将auto_ptr传递给函数时......”仅适用于按值传递; f()可能会接受对auto_ptr的引用。 – 2010-10-04 09:03:02

3

事情不妥:

  • 一个永远不会被删除。
  • f未被声明。
  • 乙方应可能是auto_ptr<tClass>类型。
  • new tClass()tClass*类型,是不是分配给B.