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;
}
Это не достаточно умен, чтобы иметь дело с копией и назначением. По крайней мере, сделать его не скопированным. – juanchopanza
Как вы замечаете, что это болтается? – molbdnilo
Также: 'nullptr' * и *' 0' - выберите один и придерживайтесь его (предпочтительно 'nullptr'). – molbdnilo