2016-02-24 2 views
2

Пожалуйста, ознакомьтесь с приведенным ниже кодом. Это умный указатель? Если да, то почему первый объект, p1, свисает в конце кода? (То есть p2 удаляется с помощью деструктора, но p1 остается, почему?)Является ли это умным указателем?

#include <iostream> 
#include <vector> 
using namespace std; 

template <class T> class my_auto_ptr { 
    T* myptr; 

public: 
    my_auto_ptr(T* ptr = 0) : myptr(ptr) { } 

    ~my_auto_ptr() { 
     delete myptr; 
    } 

    T* operator ->() const { 
     if (myptr != nullptr) return myptr; 
     else throw runtime_error(""); 
    } 
    T& operator*() const { 
     if (myptr != nullptr) return *myptr; 
     else throw runtime_error(""); 
    } 
    T* release() { 
     T* rptr = myptr; 
     myptr = 0; 
     return rptr; 
    } 
}; 

//---------------------------------- 

int main() try { 
    my_auto_ptr<vector<int> > p1(new vector<int>(4, 5)); 
    cout << p1->size() << endl; 

    my_auto_ptr<int> p2(new int(6)); 
    cout << *p2 << endl; 

    return 0; 
} 

//------------------------------- 

catch (...) { 
    cerr << "Exception occurred.\n"; 
    return 1; 
} 
+5

Это не достаточно умен, чтобы иметь дело с копией и назначением. По крайней мере, сделать его не скопированным. – juanchopanza

+2

Как вы замечаете, что это болтается? – molbdnilo

+2

Также: 'nullptr' * и *' 0' - выберите один и придерживайтесь его (предпочтительно 'nullptr'). – molbdnilo

ответ

7

Это умный указатель?

Нет. Он может копироваться и присваиваться, но выполнение любой из этих операций приведет к нескольким ударам. Вы должны убедиться, что он либо не копируется, либо не назначается, либо реализует the rule of 3 or 5.

Смежные вопросы