Malloc in D
Dejan Lekic
dejan.lekic at gmail.com
Fri Apr 27 02:20:03 PDT 2012
On Friday, 27 April 2012 at 09:05:12 UTC, Marcin wrote:
> Hi!
> I find code:
> [code]
> import c.stdlib;
> import c.stdlib;
> import std.outofmemory;
>
> class Foo{
> static void[] buffer;
> static int bufindex;
> static const int bufsize = 100;
> static this(){
> void *p;
> p = malloc(bufsize);
> if (!p)
> throw new OutOfMemory;
> gc.addRange(p, p + bufsize);
> buffer = p[0 .. bufsize];
> }
> static ~this(){
> if (buffer.length){
> gc.removeRange(buffer);
> free(buffer);
> buffer = null;
> }
> }
> new(uint sz){
> void *p;
> p = &buffer[bufindex];
> bufindex += sz;
> if (bufindex > buffer.length)
> throw new OutOfMemory;
> return p;
> }
> delete(void* p){
> assert(0);
> }
> static int mark(){
> return bufindex;
> }
>
> static void release(int i){
> bufindex = i;
> }
> }
> void test(){
> int m = Foo.mark();
> Foo f1 = new Foo; // allocate
> Foo f2 = new Foo; // allocate
> Foo.release(m); // deallocate f1 and f2
> }
> [/code]
> When I try compile i have some error:[code]
> vander at vander-VirtualBox:~/Pulpit/D$ gdc Memory.d -o Memory
> Memory.d:1: Error: module stdlib is in file 'c/stdlib.d' which
> cannot be read
> import path[0] =
> /usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.4.5/../../../../../include/d/4.4.5/i686-linux-gnu
> import path[1] =
> /usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.4.5/../../../../../include/d/4.4.5
> vander at vander-VirtualBox:~/Pulpit/D$[/code]
> When i comment import c.stdlib;
> I have error
> [code]
> vander at vander-VirtualBox:~/Pulpit/D$ gdc Memory.d -o Memory
> Memory.d:11: Error: undefined identifier malloc
> Memory.d:11: Error: function expected before (), not __error of
> type _error_
> Memory.d:13: Error: identifier 'OutOfMemory' is not defined
> Memory.d:13: Error: OutOfMemory is used as a type
> Memory.d:13: Error: new can only create structs, dynamic arrays
> or class objects, not void's
> Memory.d:13: Error: can only throw class objects, not type void*
> Memory.d:14: Error: undefined identifier gc, did you mean
> static import gcc?
> Error: no property 'addRange' for type 'TOK149'
> Memory.d:14: Error: function expected before (), not __error of
> type TOK149
> Memory.d:19: Error: undefined identifier gc, did you mean
> static import gcc?
> Error: no property 'removeRange' for type 'TOK149'
> Memory.d:19: Error: function expected before (), not __error of
> type TOK149
> Memory.d:20: Error: undefined identifier free, did you mean
> function fread?
> Memory.d:20: Error: function expected before (), not __error of
> type _error_
> Memory.d:29: Error: identifier 'OutOfMemory' is not defined
> Memory.d:29: Error: OutOfMemory is used as a type
> Memory.d:29: Error: new can only create structs, dynamic arrays
> or class objects, not void's
> Memory.d:29: Error: can only throw class objects, not type void*
> vander at vander-VirtualBox:~/Pulpit/D$
> [/code]
> What's can be wrong?
You probably have a very old GDC...
1) GC is a Struct inside core.memory so you need a line:
GC gc;
2) You need to throw OutOfMemoryError which is defined in
core.exception.
3) You need const(void*) pointers for GC methods.
So I first recommend you install latest GDC, and then modify your
code to be more up-to-date.
I hope this helps.
Regards :)
More information about the Digitalmars-d-learn
mailing list