April 04, 2004
hiya. this code causes an access violation:
------------------------------------------------------------

import std.c.stdlib;
import std.outofmemory;
import std.gc;

class Foo
{
new(uint sz)
{
void* p;

p = std.c.stdlib.malloc(sz);
if (!p)
throw new OutOfMemory();
std.gc.addRange(p, p + sz);
return p;
}

delete(void* p)
{
if (p)
{	std.gc.removeRange(p);
std.c.stdlib.free(p);
}
}
}



void main()
{
printf("new...\n");
Foo bar = new Foo;
printf("delete...\n");
delete bar;
printf("fatality...\n");
}

------------------------------------------------------------

am i missing sth or is that a bug ? obviously the code comes from "http://www.digitalmars.com/d/memory.html", though i had to add "std." before 'gc.*' to make it compile <- the documentation needs a change.

compile log = """
------------------------------------------------------------
D:\dmd\bin\..\..\dm\bin\link.exe C:\h3\d\dide\Projects\Temp\Temp,Temp.exe,,user32+kernel32/noi; D:\dmd\bin\dmd.exe   -odC:\h3\d\dide\Projects\Temp -ofTemp.exe "C:\h3\d\dide\Projects\Temp\Temp.d"
------------------------------------------------------------
Build started on 4/4/2004 at 13:13:58



Build Succeeded
"""

OUTPUT = """
C:\H3\D\dide\Projects\Temp>temp
new...
delete...
Error: Access Violation
"""

im running WindowsXP SP1 on AthlonXP. Im using the most recent version of dmd.


April 05, 2004
h3r3tic wrote:

[...]
> am i missing sth or is that a bug ?
[...]

Both.

Foo is missing any "normal" declaration. So it is completely useless. Declaring something, I used `int x;', makes the error vanish.

Anyway this shouldn't cause an AV or an "Win32 exception", which throws when deleting the printf.

So long!