Re: A question about new
Ron Natalie wrote:
stevejay wrote:
I came across a problem I can't google a definitive answer to.
In the push() member function, if the new call fails to get memory or
the T copy ctor throws, will the variable head_ retain its previous
value
If new throws, the assignment never happens. head_ is unmodified.
I'm pretty sure that this is the intent, but I'd be interested
in seeing the actual language in the standard which guarantees
it. There's certainly nothing that says that the operator new
is atomic, and other operators with side effects are definitly
allows to perform the operations in different orders, to the
point of the side effects not being visible until the next
sequence point.
In the case of operator new, simple value dependancy means that
the assignment of the results cannot take place before the
allocation function returns; if the allocation function throws,
we know that it has not occurred. In the case of an
initialization without a function call, the issue is also very
clear: in
int *p = new int( 42 ) ;
p may be written with the new pointer before 42 is written to
the newley allocated int. (But of course, there can be no
exceptions thrown by the initialization in such cases.)
Finally, as far as I can see, there is no sequence point between
calling the constructor, and assigning the pointer, so as far as
I can see, there is no imposed order; the compiler can do the
two operations in any order it pleases.
As I said, I'm fairly certain that allowing this (if it is
allowed) is not intentional. Also, I know of no implementation
which does assign the pointer before calling the constructor,
and from a quality of implementation point of view, I would
consider it a very poor implementation which did. But I'd
really like to see something in the standard which supported the
idea that this is, in fact, illegal.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
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! ]