错误:null取消引用

时间:2010-07-07 04:28:41

标签: d

此代码:

int main(char[][] args)
{
  MyObject obj;
  obj.x;
  return 0;
}

给我:Error: null dereference in function _Dmain当我用-O标志编译它时(在dmd2上)为什么?是不是在堆栈上分配了obj?我应该总是使用new来创建对象吗?

2 个答案:

答案 0 :(得分:8)

摘要:您必须使用新对象。总是

D的类比C ++更接近C#或Java。具体而言,对象始终是始终参考值。

MyObject是一个指向实际对象的指针。因此,当您使用MyObject obj;时,您正在创建一个null指针,实际上并没有创建一个对象。必须使用new运算符创建对象:

auto obj = new Object();

这会在堆上创建obj。

你无法在D中直接在堆栈上构造对象。你能做的最好就是这样:

scope obj = new MyObject;

编译器允许将对象放在堆栈上,但不必。

(实际上,我怀疑这可能会在D2的未来版本中消失。)

另外,如果 使用D2,那么我相信你的主要功能应如下所示:

int main(string[] args)
{
    ...
}

char[]string具有相同的物理布局,但意思略有不同;具体来说,string只是immutable(char)[]的别名,所以使用char[]就可以绕过const系统保护。

答案 1 :(得分:0)

由于我是一个VB人,所以我没有很好地阅读你的代码,但看起来你正在启动一个没有值的对象。

您创建一个名为obj的对象 你打电话给obj.x. 然后你返回“0”(零)

你究竟在做什么?我很确定obj需要是新的,你需要返回一些物理“0”以外的东西