读书人

新年快乐另请问个push_back指针的小

发布时间: 2012-03-04 11:13:33 作者: rapoo

新年快乐,另请教个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<T>& operator=(const _shared_ptr<U> &rhs)
{
if (this != &other)
{
if (!--*_cnt)
{……

[解决办法]
因为下面这个模板函数并不是拷贝构造。
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也是现成的。

读书人网 >C++

热点推荐