Re: auto_ptr<void>
James Dennett ha scritto:
DaVinci wrote:
Heinz Ozwirk wrote:
"Ulrich Eckhardt" <eckhardt@satorlaser.com> schrieb im Newsbeitrag news:st1pi3-r35.ln1@satorlaser.homedns.org...
Greetings!
There recently was a thread ("dynamically allocated buffers") about buffers,
and I had the simple idea to use ::operator new() to allocate storage and
store that in an auto_ptr<void>.
I simply wonder if this would work and correctly release the allocated
storage.
Short question -- short answer: NO! It doesn't work as { void* x = new Something; delete x; } doesn't work either.
why not?
void is an incomplete type. Calling delete on a pointer
to an incomplete type is undefined behavior. (This case
is trivially detected at compile time, but not all compilers
issues a diagnostic for it.)
This is not exact. Calling delete on a pointer to an incomplete type
leads to undefined behaviour only if "the complete class has a
non-trivial destructor or a deallocation function" (5.3.5/5). Anyway,
this is not the true reason of UB in this case.
As I said in another post, std::auto_ptr<void> is illegal because of the
general requirement of the C++ Standard Library (17.4.3.6/2), so let's
focus on the "void* p = Something; delete p;". We have to split in two
cases:
1) void* p = new MyClass; delete p;
Where MyClass is any concrete class (polymorphic or not, with trivial
destructor or not, it doesn't matter!). This code leads to UB because of
5.3.5/3 "if the static type of the operand is different from its dynamic
type, the static type shall be a base class of the operand???s dynamic
type [...]". If that's still obscure to you, footnote 32 is more
explicit: "This implies that an object cannot be deleted using a pointer
of type void* because there are no objects of type void."
2) void* p = ::operator new(100); delete p;
This leads to UB because of 5.3.5/2: "the value of the operand of delete
shall be a pointer to a non-array object or a pointer to a sub-object".
Being a pointer to raw memory, p doesn't point to any object and so it
fails the precondition.
HTH,
Ganesh
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]