#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/

10-11 16:55