新年快乐,另请教个push_back指针的小问题
自己写了个小智能指针,这样往容器里放指针时就不用担心析构的问题了。可是往vector里放智能指针后,总会出现很诡异的问题,代码如下:
智能指针:
- C/C++ code
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;};测试部分:
- C/C++ code
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;}结果是:
00527800 5379384
00527860 2
貌似第一个指针自己析构了,但我实在找不出问题,哪位知道的请不吝赐教,万分感谢!
[解决办法]
lz 可能是模板类的拷贝构造函数和赋值运算符吧,push_back的时候没有调用到copy construct
[解决办法]
你要阻止析构
[解决办法]
不知道为什么。。
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;
}
没有other,是rhs
[解决办法]
[解决办法]
因为下面这个模板函数并不是拷贝构造。
template<typename U>
_shared_ptr(const _shared_ptr<U> &other)
该函数仅当U与T不同的时候,才会被实例化且被调用。仅仅实现上面的函数,那么就相当于没有给出拷贝构造。那么编译器会自动生成一个拷贝构造,实现按位拷贝。这样的语义显然不是楼主需要的。
正确的做法是,模板函数和拷贝构造同时提供。
template<typename U>
_shared_ptr(const _shared_ptr<U> &other);
_shared_ptr(const _shared_ptr<T> &other);
[解决办法]
楼主何苦自己造轮子。
boost里ptr_container,现成的;smart_ptr也是现成的。