🔒 Locked
how does delete[] do it?
Advertisement
Original Post
if you are desperate to know, you can place a try/catch block around an infinite loop that tests each place in the array. Although many people would probably kill me for suggesting it.
quote:
Original post by Exorcist
if you are desperate to know, you can place a try/catch block around an infinite loop that tests each place in the array. Although many people would probably kill me for suggesting it.
Assuming that an exception is thrown when you access invalid memory, that technique won''t tell you how long your arrays is, only how far from the starting point you have invalid memory.
If you are desperate to know, don''t forget it in the first place. You have to know how many items to allocate when calling new [], so just save that value if you need to know it later.
The block is probably overallocated and the size of it is stored at the beginning. Then it returns you a pointer 4 bytes in (or whatever the max allocation size is). delete[] then just backs up 4 bytes, gets the size, and unallocates the entire block.
Thats one way to do it. Come on people, you can step into the runtime library yourself and see how its done.
Thats one way to do it. Come on people, you can step into the runtime library yourself and see how its done.
quote:
Original post by honayboyz
so will
int x;
int *ptr = &x
ptr--;
will ptr* = 1?
x is not dynamically allocated, which is what we''re talking about.
$ cat array.cpp
int *ary = new int[50000];
cout << ary-- << endl;
cout <<*ary-- << endl;
cout <<*ary-- << endl;
$ strace ./array
old_mmap(NULL, 200704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x401a7000
write(1, "0x401a7008\n", 11) = 11
write(1, "200706\n", 7) = 7
write(1, "0\n", 2) = 2
It would appear that C++ does infact keep some space for itself. 8 bytes, in fact.
furthermore, it _seems_ that is is a 64-bit integer specifying how much space was allocated. and it overestimates by two bytes.
interesting
int *ary = new int[50000];
cout << ary-- << endl;
cout <<*ary-- << endl;
cout <<*ary-- << endl;
$ strace ./array
old_mmap(NULL, 200704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x401a7000
write(1, "0x401a7008\n", 11) = 11
write(1, "200706\n", 7) = 7
write(1, "0\n", 2) = 2
It would appear that C++ does infact keep some space for itself. 8 bytes, in fact.
furthermore, it _seems_ that is is a 64-bit integer specifying how much space was allocated. and it overestimates by two bytes.
interesting
quote:
Original post by antareus
The block is probably overallocated and the size of it is stored at the beginning. Then it returns you a pointer 4 bytes in (or whatever the max allocation size is). delete[] then just backs up 4 bytes, gets the size, and unallocates the entire block.
Thats one way to do it. Come on people, you can step into the runtime library yourself and see how its done.
And sizeof(int) == 4 on x86, besides the example code being incorrect.
Wohoo! I am not the only one with this question!!
http://www.gamedev.net/community/forums/topic.asp?topic_id=147725
At this point in time I am at the mercy of the
OS to "delete [] myarray", and ignoring how the system knows how big a arbitrary dynamically allocated array is during deletion.
www.cppnow.com
http://www.gamedev.net/community/forums/topic.asp?topic_id=147725
At this point in time I am at the mercy of the
OS to "delete [] myarray", and ignoring how the system knows how big a arbitrary dynamically allocated array is during deletion.
www.cppnow.com
Topic Locked
This topic has been locked by a moderator. New replies are not allowed.
Sign in to reply to this topic.
Advertisement