What can you "new"
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Sun Mar 22 19:51:58 PDT 2009
Derek Parnell wrote:
> On Sun, 22 Mar 2009 14:31:07 -0400, Steve Teale wrote:
>
>> void str()
>> {
>> auto s = new char[];
>> }
>>
>> void main()
>> {
>> str();
>> }
>>
>> produces:
>>
>> str.d(3): Error: new can only create structs, dynamic arrays or class objects, not char[]'s.
>>
>> What am I missing here, isn't char[] a dynamic array?
>
> I believe that the message is wrong, or at least misleading. The 'dynamic'
> here does not mean variable-length arrays but not 'static' - as in ...
> address is not known at compile time.
>
> The 'new' is supposed to create something on the heap and return a
> pointer/reference to it. Thus structs, fix-length arrays, and class objects
> are obvious candidates for that. Variable-length arrays are always created
> on the heap anyway, so to ask for a 'new char[]' is asking for the 8-byte
> pseudo-struct for the array to be created on the heap (which would not be
> initialized to anything) and return a pointer to it. This would give you
> one more level of indirection that you're probably not expecting.
>
> The normal way to create an empty (new, as in never been used yet) char[]
> is simply ...
>
> void str()
> {
> char[] s;
> }
>
> But you knew (no pun intended) that already.
>
>
> What you were actually asking for is more like ...
>
> struct dynary
> {
> size_t len;
> void *data;
> }
>
> void str()
> {
> auto s = cast(char[]*)(new dynary);
> }
>
> void main()
> {
> str();
> }
>
I think the question is very legit. char[] is a type like any other
type. What if I want to create a pointer to an array?
new is a really bad construct. I'm very unhappy that D inherited it.
Andrei
P.S. The way you create a pointer to an array is:
auto weird = (new char[][1]).ptr;
More information about the Digitalmars-d
mailing list