View difference between Paste ID: 9Qgf3vc7 and
SHOW:
|
|
- or go back to the newest paste.
1 | - | |
1 | + | /* |
2 | * (C) 2011 Daniel G., do whatever you want with this code but please note | |
3 | * that it's just a simple example | |
4 | */ | |
5 | import std.stdio; | |
6 | import std.conv; | |
7 | import core.stdc.stdlib; | |
8 | ||
9 | class Foo { | |
10 | int x; | |
11 | this(int x) { | |
12 | writefln("Foo's constructor called"); | |
13 | this.x = x; | |
14 | } | |
15 | ~this() { | |
16 | writefln("Foo's destructor called"); | |
17 | } | |
18 | } | |
19 | ||
20 | T myNew(T, Args...) (Args args) { | |
21 | // get class size of class object in bytes | |
22 | size_t clSize = __traits(classInstanceSize, T); | |
23 | // allocate memory for the object | |
24 | void* tmp = core.stdc.stdlib.malloc( clSize ); | |
25 | if(!tmp) | |
26 | throw new Exception("no memory"); | |
27 | // slice it to become a void[] | |
28 | void[] objMem = tmp[0..clSize]; | |
29 | // use std.conv.emplace to put Object into that memory | |
30 | T ret = emplace!(T, Args)(objMem, args); | |
31 | return ret; // return new custom allocated Object | |
32 | } | |
33 | ||
34 | void myDelete(T)(ref T obj) { | |
35 | clear(obj); // so destructor is called | |
36 | // free memory of the object | |
37 | core.stdc.stdlib.free(cast(void*)obj); | |
38 | // shouldn't hurt, the object must not be used anymore anyway | |
39 | obj = null; | |
40 | } | |
41 | ||
42 | void main() { | |
43 | Foo f = myNew!Foo(42); | |
44 | writefln("f.x = %s", f.x); | |
45 | myDelete(f); | |
46 | assert(f is null); // yeah it's null. | |
47 | writefln("bye."); | |
48 | } |