#include <memory>
#include <iostream>
using namespace std;
class MyClass
{
public:
int i;
MyClass(int s) {
i=s;
}
~MyClass() {
cout<<"This class has been destroied. "<<i<<endl;
}
void myFunc() {
cout<<"myFunc() done. "<<i<<endl;
}
};
int main()
{
auto_ptr<MyClass> ptr1(new MyClass(1));
auto_ptr<MyClass>ptr2(new MyClass(2));
ptr1->myFunc();
ptr2->myFunc();
cout<<"test 1 done\n"<<endl;
ptr2 = ptr1;
ptr2->myFunc();
//ptr1->myFunc();
cout<<"test 2 done\n"<<endl;
}
/*
$ ./a.out
myFunc() done. 1
myFunc() done. 2
test 1 done
This class has been destroied. 2
myFunc() done. 1
test 2 done
* */
如果上面的
ptr1->myFunc();
没有被注释掉,则结果如下。但是我听不懂。我认为ptr1当时并未销毁。谁能帮助进一步解释它?
$ ./a.out
myFunc() done. 1
myFunc() done. 2
test 1 done
This class has been destroied. 2
myFunc() done. 1
Segmentation fault (core dumped)
最佳答案
当复制或分配旧auto_ptr
时,它的行为非常奇怪。它具有传输语义,而不是复制语义。这意味着与您说ptr2 = ptr1;
相比,ptr1
实际上已更改:它不再指向任何内容。 (并且ptr2
最初指向的内容当然已删除。)
因此,在分配了ptr1
后,您一定不能使用unique_ptr
(直到您再次为其分配或重置它)。
尽管这样的智能指针是非常可取的事情,但这种行为是如此尴尬的事实表明该语言中缺少某些内容。正确的解决方案需要右值引用,并且新的auto_ptr
试图解决与ojit_code相同的问题,其行为更加明智:您完全不能复制或复制分配它,但是可以移动它-这是语言:
unique_ptr<MyClass> ptr1(new MyClass), ptr2(new MyClass);
ptr2 = std::move(ptr1); // now it's clear that ptr1 is no longer usable
assert(!ptr1);
关于c++ - 为什么那时无法引用智能指针auto_ptr?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14110587/