On 28.11.2025 21:14, tzsz wrote:
Hello,
I'd like to ask if there is any way of creating a class instance at a location given by a pointer. In C++ this is usually done using new(pointer) MyClass(); and I saw a post made by Walter Bright that suggested adding this to D. The code from that post did not compile on my machine tho. And the post was a few years old, so I don't know what the current state regarding this feature is. I really tried finding something via Google but I was unsuccessful.

The reason for this is that I am looking for a way to use classes with all their nice features but without the GC. Therefore I'd be doing all the (de)allocations on my own. For this, I am currently using malloc and free from core.stdc.

Kind regards

In C++ it is called placement new. In D you should emplace class:

```D
import core.lifetime : emplace;
import core.stdc.stdlib : malloc, free;
import std.stdio : writeln;

class MyClass
{
    int value;

    this(int v)
    {
        value = v;
        writeln("MyClass constructor called with value: ", value);
    }

    ~this()
    {
        writeln("MyClass destructor called for value: ", value);
    }
}

void main()
{
    // Allocate memory for MyClass
    void* rawMemory = malloc(__traits(classInstanceSize, MyClass));
    if (!rawMemory)
    {
        throw new Exception("Out of memory!");
    }

    // Cast the raw memory to the class type
    MyClass instancePtr = cast(MyClass)rawMemory;

    // Emplace the MyClass instance
    emplace!MyClass(instancePtr, 10);

    // Now you can use instancePtr as a regular class instance
    writeln("Value from emplaced instance: ", instancePtr.value);

// Remember to manually call the destructor and free the memory for non-GC allocated objects
    destroy(instancePtr);
    free(rawMemory);
}
```

Reply via email to