你能告诉我这段代码有什么问题吗?我被问这个在接受采访时,我不知道什么地方错了指针和智能指针的区别
tClass是一个测试类,打印tClass成员的方法printSomething。
tClass * A = new tClass();
f(A);
A->printSomething();
auto_ptr<tClass> * B = new tClass();
f(B);
B-> printSomething();
或这是一个诡计的问题。
你能告诉我这段代码有什么问题吗?我被问这个在接受采访时,我不知道什么地方错了指针和智能指针的区别
tClass是一个测试类,打印tClass成员的方法printSomething。
tClass * A = new tClass();
f(A);
A->printSomething();
auto_ptr<tClass> * B = new tClass();
f(B);
B-> printSomething();
或这是一个诡计的问题。
auto_ptr的是一种智能指针的那恰好一方拥有指针的前提下进行操作的正确类型的,并且如果拥有它派对超出范围,指针被删除。
当你传递一个auto_ptr的功能,你是“给予”的功能指针,所以你不要它了。当你解引用它时,你会得到一个空指针行为(当然这是未定义的)。
为了让你的代码进行编译,但是,你必须改变你的B
定义了一下,应该是
auto_ptr<tClass> B = new tClass;
因为auto_ptr的是不是一个类型(其类型模板),和你实际上并不需要一个指向该类型的指针,因为类会重载这些行为。
事情不妥:
auto_ptr<tClass>
类型。new tClass()
是tClass*
类型,是不是分配给B.
这可能听起来愚蠢:什么是函数f()? – beta0x64 2010-10-03 19:59:36
太添加到ChrisW,'F'可能不接受'auto_ptr'参数和'auto_ptr'不转换为原生指针,所以你需要'F(B.get())'。 – Potatoswatter 2010-10-03 20:04:03
如果f是'template void f(T ptr){ptr-> printSomething(); }'? –
SingleNegationElimination
2010-10-03 20:09:16