这段代码:
int main(char[][] args)
{
MyObject obj;
obj.x;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给我:Error: null dereference in function _Dmain当我用-O标志编译它时(在dmd2上)为什么?是不是obj在堆栈上分配?我应该总是new用来创建对象吗?
总结:你必须要有新的对象.总是.
D的类比C++更接近C#或Java.具体而言,对象总是始终是参考值.
引擎盖下的MyObject是指向实际对象的指针.因此,当您使用时MyObject obj;,您正在创建一个null指针,而事实上并没有创建一个对象.必须使用new运算符创建对象:
auto obj = new Object();
Run Code Online (Sandbox Code Playgroud)
这会在堆上创建obj.
您无法在D中直接在堆栈上构造对象.您可以做的最好的事情是这样的:
scope obj = new MyObject;
Run Code Online (Sandbox Code Playgroud)
允许编译器将对象放在堆栈上,但不必.
(实际上,我怀疑这可能会在D2的未来版本中消失.)
在一个侧面说明,如果你正在使用D2,那么我相信你的主要功能应该是这样的:
int main(string[] args)
{
...
}
Run Code Online (Sandbox Code Playgroud)
char[]并且string具有相同的物理布局,但意味着略有不同的东西; 特别是,string它只是一个别名immutable(char)[],所以通过使用char[]你绕过const系统保护.