Stack-based object instantiation in D

allocation, d, phobos, raii, stack

Solution

You seem to be mixing up C++ classes with D classes.

D classes are always passed by reference (unlike, say, C++ classes), and `PerformanceCounter t` does not allocate the class on the stack, merely a pointer to it.

This means that `t` is set to `null` because, well, `null` is the default initializer for pointers - hence the error.

EDIT: You can think of D `Foo` class as a C++'s `Foo*`.

If you want this to be allocated on the heap, you could try using structs instead - they can also have methods, just like classes. They do not, however, have inheritance.

Problem

I'm learning D, and am confused by an error I'm getting. Consider the following: ``` module helloworld; import std.stdio; import std.perf; ptrdiff_t main( string[] args ) { auto t = new PerformanceCounter; //From managed heap //PerformanceCounter t; //On the stack t.start(); writeln( "Hello, ", size_t.sizeof * 8, "-bit world!" ); t.stop(); writeln( "Elapsed time: ", t.microseconds, " \xb5s." ); return 0; } //main() ``` Yields a perfectly respectable: ``` Hello, 32-bit world! Elapsed time: 218 µs. ``` Now consider what happens when I attempt to initialize PerformanceCounter on the stack instead of using the managed heap: ``` //auto t = new PerformanceCounter; //From managed heap PerformanceCounter t; //On the stack ``` Yields: ``` --- killed by signal 10 ``` I'm stumped. Any thoughts as to why this breaks? (DMD 2.049 on Mac OS X 10.6.4). Thanks in advance for helping a n00b.

Original source