mm11214014 2012年01月24日
新年快乐,另请教个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;
}


结果是:
00527800 5379384
00527860 2
貌似第一个指针自己析构了,但我实在找不出问题,哪位知道的请不吝赐教,万分感谢!

...全文
169 点赞 收藏 15
写回复
15 条回复

还没有回复,快来抢沙发~

发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告