visual-studio - 为什么这个 D 程序会抛出一个奇怪的访问冲突异常?
问题描述
每当运行以下程序时,它都会因这个奇怪的异常而崩溃:
“在 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;
}
它工作得很好。课堂休息什么?
解决方案
您没有在这些行上初始化事件:
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 有串联运算符 ~:
public void addHandler(void function(Args) handler)
{
_funcArray ~= handler;
}
推荐阅读
- macos - 将字符打印到标准输出,x86 mac
- php - Polylang - 如何在触发“plugins_loaded”操作之前在插件或 mu-plugin 中添加“add_filter”
- javascript - Javascript使用导航器将url链接复制到剪贴板
- php - 当使用带有 HTML 下拉框选择器的 PHP 时,它给了我一个未定义的错误?
- symfony - 在谷歌页面速度中,我有一个最大的内容绘画
- themes - $.extend($.tablesorter.themes.jui, { Uncaught Exception :Cannot read 'themes' undefined
- python - 按范围过滤 Mongo 嵌入文档
- python - 停止时钟,从绿色开始,在 5 分钟变为黄色,然后在 10 分钟后再次变为红色
- javascript - 如何使用“timeupdate”事件侦听器突出显示音频中的文本?
- flexdashboard - heatmaply + flexdashboard = validateCssUnit(sizeInfo$width) 中的错误:CSS 单位必须是单元素数字或字符向量