此代码:
int main(char[][] args)
{
MyObject obj;
obj.x;
return 0;
}
给我:Error: null dereference in function _Dmain
当我用-O标志编译它时(在dmd2上)为什么?是不是在堆栈上分配了obj
?我应该总是使用new
来创建对象吗?
答案 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”以外的东西