Re: Is the design of operator new/delete flawed?
On Jun 5, 1:59 am, Kristof Zelechovski <giecr...@stegny.2a.pl> wrote:
"Seungbeom Kim" <musip...@bawi.org> napisal:
I came across an article that discusses the design of operator
new/delete, which the author argues is "badly wrong".
http://www.scs.stanford.edu/~dm/home/papers/c++-new.html
I'm not quite sure what the guy is getting at; for
example in this code (quote from above link):
typedef struct intlist { int size; int i[1]; } intlist;
intlist *makeintlist (int size)
{
intlist *ilp = malloc (offsetof (intlist, i[size])); /* not C++ */
ilp->size = size;
return ilp;
}
he bemoans the lack of a C++ equivalent; but surely
the whole of the above can be replaced with:
std::vector<int> il(size);
It looks like he is complaining that new/delete cannot
do some particular task; however in C++ there are many
ways to skin the cat, and the task can be accomplished
by other means.
There is no match for new(args) T; delete(args) p is ill-formed.
It is a serious inconsistency.
I don't see why you would want args to delete; but if
you did then you could include in the definition of T:
void delete_me(args....) { foo(args); delete this; }
Or you could do the same thing as a non-member function.
I am not sure if the following problem was mentioned:
Pick such a number N that size_t(4 * N) + 4 == 0.
What do you get from new char[N + 2][4]?
And you can fall into this trap quite inadventently.
The whole construct is shaky and it only happens to work sometimes.
C has the same problem; what is the result of:
calloc(N+2, 4)
?
The C standard says that it should either return a
pointer to a valid allocation of the intended size,
or NULL, but there have been popular implementations
that returned a pointer to a smaller block.
I'm not sure exactly what the C++ standard says,
but a reasonable behaviour would be to throw the
allocation failure exception if it cannot allocate
a block of the intended size.
(Is there anything in C++ preventing this allocation
from succeeding? In C it does not seem to be
explicitly forbidden for calloc to allocate an
object larger than SIZE_MAX).
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]