2009年2月3日星期二

auto delete ptr

有时候经常需要这样的一个东西
...
{
T * p = new T ;
....
delete p;
}
...

boost的smart ptr有shared_ptr可以用,不过boost实在太大了,这是唯一让我感到有些不爽的地方。

于是写了一个auto_deleteT的template class

template
class auto_deleteT {
public:
auto_deleteT(T * p) : _ptr(p){
}
~auto_deleteT() {
if(_ptr)
delete _ptr;
}
inline T * operator->() const {// never throws
assert(_ptr != 0);
return _ptr;
}
protected:
T * _ptr;
};

这样可以很方便使用 :
{
auto_deleteT aptr(new T(...));
aptr->xxxx(....)
....
}

接着,再添加一个支持,可以把auto_deleteT放到STL的容器内:
...
auto_deleteT(const auto_deleteT & a){
_ptr = a._ptr;
// giveup pointer.
auto_deleteT & at = (auto_deleteT &)a;
at.reset();
}
auto_deleteT & operator = (const auto_deleteT & a){
_ptr = a._ptr;
auto_deleteT & at = (auto_deleteT &)a;
at.reset();
return *this;
}
void reset() {
_ptr = 0;
}
....
STL容器内部使用的copy复制内容,这样如果auto_delete ptr被复制后,就主动放弃
pointer内容:

{
std::vector objs;
for(int i=0; i < n; i++) {
a(new obj...);
objs.push_back(a);
}
}

不过由于它没有引用计数,所以使用上要小心,不过也不是什么大问题:
objs[n]->xxx()之类的,就可以避免内存泄露。


没有评论:

发表评论