Re: Smart pointer referencing its owner
On Feb 26, 4:12 pm, Pavel Minaev <int...@gmail.com> wrote:
Consider the following (simplified) implementation of
std::auto_ptr<T>::reset():
void reset(T* newptr = 0) {
if (this->ptr && this->ptr != newptr) {
delete this->ptr;
}
this->ptr = newptr;
}
Now consider the following code which uses the above implementation:
struct foo {
std::auto_ptr<foo> ap;
foo() : ap(this) {}
void reset() { ap.reset(); }
};
int main() {
(new foo)->reset();
}
With the above implementation of auto_ptr, this results in U.B. at the
point of auto_ptr::reset().
...
Now the questions are:
1) Is the above implementation of auto_ptr standard compliant or not;
and what is the wording in the Standard that, explicitly or
implicitly, allows it to be that way?
Here is the description of auto_ptr::reset() from the C++ Standard:
void reset(X* p=0) throw();
Effects: If get() != p then delete get().
Postconditions: *this holds the pointer p.
So, the answer is yes, the proposed implementation of auto_ptr::reset
() is conforming because it does delete the current pointer (if not
equal to p) and then stores p.
2) Is the above code that uses auto_ptr standard compliant or not; and
what is the wording in the Standard that, explicitly or implicitly,
specifies or prohibits U.B. where pointed?
According to the C++ Standard, the user program above is well-formed
and its behavior is undefined.
By the way, this whole scheme also fully applies to shared_ptr, and so
do the questions. That sample auto_ptr implementation is quite real,
too - at least one compiler vendor implements it that way (and does
the same to shared_ptr).
The sample code really has nothing to do with the behavior of auto_ptr
or shared_ptr. Any C++ object that attempted to delete itself in its
destructor would have the same, undefined behavior. So whether the
destructor calls "delete this" explicitly or uses a smart pointer
member variable to do so - does not make any real difference.
Greg
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]