2015-11-24 123 views
0

请考虑下面的程序(参见现场演示here为什么D不允许在堆栈上创建对象?

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; 
} 

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

另一个令人惊讶的是ideone会产生编译错误为:

prog.d(14): Error: null dereference in function _Dmain 

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

[email protected](0): Access Violation 
---------------- 
0x00402056 
0x00405F9B 
0x00405EB1 
0x00403D93 
0x7651EE6C in BaseThreadInitThunk 
0x7758377B in RtlInitializeExceptionChain 
0x7758374E in RtlInitializeExceptionChain 
+0

“所有变量都是参考”比较常见。在我熟悉的语言中,像C和C++这样的允许你用值语义定义类型的东西是例外,而不是规则。 – Hurkyl

+2

D允许您使用值语义定义类型,就像结构而不是类一样。类总是通过引用来访问,但是分配内存的地方是由你自己决定的 - 包括在堆栈中。类始终是通过引用的原因在于,无论如何,即使在C++中,几乎总是您要这样做的方式 - 所以D遵循Java的领先地位并将其设置为默认值。但是类不是定义用户类型的唯一方式,所以不要忘记struct! –

回答

9

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

您在ideone上看到的null解除引用错误是因为编译器在优化过程中识别出这个问题(ideone似乎启用了优化)。尝试将-O开关添加到本地编译器调用中。

+0

那么这个程序有什么问题。看到这里:http://ideone.com/6p9isc。它在编译时失败。为什么编译器显示错误? – Destructor

+2

'import std.typecons;' –

+0

好的谢谢。但是什么是使用!运算符构造函数之前? &如果我写myclass m = scoped!myclass(); &调用get_a()成员函数会导致运行时错误?为什么?再次感谢 – Destructor

相关问题