新年快乐,另请教个push_back指针的小问题
自己写了个小智能指针,这样往容器里放指针时就不用担心析构的问题了。可是往vector里放智能指针后,总会出现很诡异的问题,代码如下:
智能指针:
template<typename T>class _shared_ptr{public: _shared_ptr(T *ptr) : _ptr(ptr), _cnt(new long(1)){} template<typename U> _shared_ptr(_shared_ptr<U> &other) { _ptr = reinterpret_cast<T*>(other.operator->()); _cnt = other.get_cnt(); ++*_cnt; } template<typename U> _shared_ptr<T>& operator=(const _shared_ptr<U> &rhs) { if (this != &other) { if (!--*_cnt) { delete _ptr; delete _cnt; } _ptr = reinterpret_cast<T*>(other.operator->()); _cnt = other.get_cnt(); ++*_cnt; } return *this; } ~_shared_ptr() { if (!--*_cnt) { delete _ptr; delete _cnt; } } T* operator->() const { assert(_ptr); return _ptr; } T& operator*() const { assert(_ptr); return *_ptr; } long* get_cnt() const { return _cnt; }private: T *_ptr; long *_cnt;};int _tmain(int argc, _TCHAR* argv[]){ vector<_shared_ptr<int> > vec; _shared_ptr<int> p1(new int(1)); _shared_ptr<int> p2(new int(2)); vec.push_back(p1); vec.push_back(p2); ofstream os("g:\\ptr.txt"); os << vec[0].operator->() << ' ' << *vec[0] << endl; os << vec[1].operator->() << ' ' << *vec[1] << endl; return 0;}
boost里ptr_container,现成的;smart_ptr也是现成的。