【问题标题】:Why does this D program throw a strange access violation exception?为什么这个 D 程序会抛出一个奇怪的访问冲突异常?
【发布时间】:2019-06-11 04:15:51
【问题描述】:

每当运行以下程序时,它都会因这个奇怪的异常而崩溃:

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

我正在使用 visuald 和 dmd 在 Visual Studio 中进行编译。不确定要提供更多信息,请问...

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;
}

它工作得很好。 课间休息什么?

【问题讨论】:

    标签: visual-studio exception d access-violation dmd


    【解决方案1】:

    您没有在这些行上初始化事件:

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

    类是引用类型,它们的初始值是null (.init)。这意味着您将需要显式初始化doIt

    Event!(int, char) doIt = new Event!(int, char)();
    

    这可以使用auto 稍微缩短一点:

    auto doIt = new Event!(int, char);
    

    这应该可以解决这个问题。这里有一个问题:Event 是否需要成为一个类并具有引用语义,或者结构是否也能满足您的目的?如果你可以使用结构体,就不需要初始化它。

    你的addHandler function 中还有另一个小挑剔:不需要++length; arr[$-1] 跳舞-D 有concatenation operator ~

    public void addHandler(void function(Args) handler)
    {
        _funcArray ~= handler;
    }
    

    【讨论】:

    • 我从模板转换为一个类,并以某种方式管理了这个废话。我知道我错过了一些东西,但不知道它是如此简单:)。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2017-01-27
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多