$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Darin Adler (darin_at_[hidden])
Date: 2001-10-18 02:42:02
on 10/18/01 12:24 AM, Darin Adler at darin_at_[hidden] wrote:
> scoped_ptr<T> sp(p);
> pn = new long(1); // may throw
> --*old_pn;
> px = sp.release();
Oops. There's no such thing as scoped_ptr::release. Well, rather than open
that can of worms, another version:
void reset(T* p=0) {
if (px == p) return; // fix: self-assignment safe
if (*pn == 1) {
T* old_px = px;
px = p;
checked_array_delete(old_px);
}
else { // allocate new reference counter
long* old_pn = pn;
try { pn = new long(1); }
catch (...) {
checked_delete(p);
throw;
}
--*old_pn;
px = p;
} // allocate new reference counter
} // reset
I think the scoped_ptr one is slightly more elegant, but I was dissuaded
from adding a scoped_ptr::release by the smart pointer documentation.
-- Darin