Visual studio 为什么这个D程序抛出一个奇怪的访问冲突异常?

Visual studio 为什么这个D程序抛出一个奇怪的访问冲突异常?,visual-studio,exception,d,access-violation,dmd,Visual Studio,Exception,D,Access Violation,Dmd,每当运行以下程序时,它都会崩溃,出现此奇怪的异常: “在dfun.exe中的0x00B31028处引发异常:0xC0000005:访问冲突读取位置0x00000000。” 我正在visual studio中使用visuald和dmd进行编译。不确定是否还有更多信息要提供,请询问 module dfun; import std.stdio; class Event(Args...) { private void function(Args)[] _funcArray; pub

每当运行以下程序时,它都会崩溃,出现此奇怪的异常:

“在dfun.exe中的0x00B31028处引发异常:0xC0000005:访问冲突读取位置0x00000000。”

我正在visual studio中使用visuald和dmd进行编译。不确定是否还有更多信息要提供,请询问

module dfun;

import std.stdio;

class Event(Args...)
{
    private void function(Args)[] _funcArray;

    public this()
    {
    }

    public void addHandler(void function(Args) handler)
    {
        _funcArray.length++;
        _funcArray[$ - 1] = handler;
    }

    public void opCall(Args args)
    {
        foreach(func; _funcArray)
        {
            func(args);
        }
    }
}

void foo(int a, char c)
{
    writeln(a, c);
}

int main()
{
    Event!(int, char) doIt;
    doIt.addHandler(&foo);

    doIt(5, 'a');

    readln();
    return 0;
}
但如果代码更改为此,则具有相同的基本功能:

module dfun;

import std.stdio;

void foo(int a, char c)
{
    writeln(a, c);
}

int main()
{
      //Event!(int, char) doIt;
      //doIt.addHandler(&foo);

      void function(int, char)[] func;

      func.length++;

      func[0] = &foo;

      func[0](5, 'a');

      readln();
      return 0;
}
它很好用。
类中断了什么?

您没有在以下行中初始化事件:

Event!(int, char) doIt;
doIt.addHandler(&foo);
类是引用类型,并且具有
null
作为其初始值()。这意味着您需要显式初始化
doIt

Event!(int, char) doIt = new Event!(int, char)();
可以使用
auto
将其稍微缩短:

auto doIt = new Event!(int, char);
这应该解决这个问题。这里有一个问题:
Event
是否需要是一个类并具有引用语义,或者一个struct是否同样适用于您的目的?如果您可以使用struct,则无需对其进行初始化

另一个小小的挑剔是在你的
addHandler函数中
:不需要
++长度;arr[$-1]
dance-D具有以下功能:


我从一个模板转换成了一个类,并不知怎么地处理了这个胡说八道的问题。我知道我错过了一些东西,但我不知道事情就这么简单:)。谢谢你的帮助!
public void addHandler(void function(Args) handler)
{
    _funcArray ~= handler;
}