Malloc in D

Marcin m_zap at o2.pl
Fri Apr 27 10:54:07 PDT 2012


Thanks for you help:)

On Friday, 27 April 2012 at 09:20:04 UTC, Dejan Lekic wrote:
> 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