为什么D不允许在堆栈上创建对象?

Des*_*tor 0 heap stack d class object

考虑以下程序(请参阅此处的实时演示)

import std.stdio;
class myclass
{
    public:
    int get_a()
    {
        return a;
    }
    private:
    int a=3;
}
int main()
{
    myclass m;  // It should be myclass m=new myclass();
    writefln("%d",m.get_a());   
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

C++支持自动(堆栈分配)和动态(堆分配)对象.但为什么每个类对象必须在D中动态分配?为什么D不支持堆栈分配的对象?

另一个令人惊讶的事情是,ideone编译器错误为:

prog.d(14): Error: null dereference in function _Dmain
Run Code Online (Sandbox Code Playgroud)

但是当我在dmd2编译器上的本地机器上尝试它时,它给了我运行时错误而不是编译时错误.为什么?为什么这个程序的行为有所不同?以下是我在dmd2给出的本地机器上的错误.

object.Error@(0): Access Violation
----------------
0x00402056
0x00405F9B
0x00405EB1
0x00403D93
0x7651EE6C in BaseThreadInitThunk
0x7758377B in RtlInitializeExceptionChain
0x7758374E in RtlInitializeExceptionChain
Run Code Online (Sandbox Code Playgroud)

Vla*_*eev 9

D允许在堆栈上放置类,请参阅std.typecons.scoped.

您在ideone上看到的空解除引用错误是因为编译器在优化期间识别出此问题(ideone似乎启用了优化).尝试将-O开关添加到本地编译器调用.

  • @PravasiMeet你需要使用`auto`:`auto m = scoped!myclass()`.原因是`scoped`是包含类'内存的结构的模板,并且可以隐式转换为类.通过`myclass m = scoped!myclass()`,你抛弃了结构包装器,它立即被释放.`!`是模板实例化运算符(如`<>`在C++中). (3认同)
  • `import std.typecons;` (2认同)