错误:null取消引用

szx*_*szx 4 d

这段代码:

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用来创建对象吗?

DK.*_*DK. 8

总结:你必须要有新的对象.总是.

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系统保护.