Re: auto_ptr<void>
Ulrich Eckhardt 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.
I accept the answer, but the reasoning here is wrong. Point is
that this here works:
void* x = ::operator new(1000);
::operator delete(x);
And this is a valid way to allocate uninitialised storage. It
doesn't have any advantage to malloc/free other than that I
hoped that it would make it possible to use it with auto_ptr.
If you're willing to live with a pragmatic solution, it will
work.
What this relies on is that 'delete x' does two things:
1. invoke the destructor
2. invoke the deallocation function
Since void* doesn't have a destructor, this is a noop and
should just call the deallocation function. Note that delete
only invokes UB when used with a type where the dynamic type
is not the static type and the type doesn't have a virtual
destructor. Indeed, void is an incomplete type, but in this
case it could be called the dynamic and static type.
The wording of the standard still says it is undefined behavior.
In practice, of course, I think about the only way it could fail
is for auto_ptr to do some kind of concept checking, and even
then, I'm not sure how concept checking could catch this.
--
James Kanze kanze.james@neuf.fr
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France +33 (0)1 30 23 00 34
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]