将 C 代码移植到不安全的 C# 时的空引用
本文关键字:引用 不安全 代码 | 更新日期: 2023-09-27 18:36:28
我正在尝试在 C# 中实现 Knuth-Morris-Pratt 算法,类似于纯 C 中的实现。
请不要告诉我正则表达式和在 C# 中使用内存的工作。因为,本主题的目的不是 C# 功能的真实和有用,而是关于在 C# 中使用指针的工作,以及关于学习这些功能的内存工作。
让我向您展示 C# 和纯 C 中的实现。
C# http://ideone.com/Ck0G0
纯 C http://ideone.com/FVAzU
我对 Pure C 中的版本没有问题,它运行良好,没有问题,但在 C# 版本中则不然。
我在 C# 中遇到以下问题:
int*[] d = new int*[M * sizeof(int)];
*d[0] = 0;
我正在捕获 NullReferenceException 已通过将 0 值设置为 *d[0] 进行处理。
我已经阅读了这个参考:
http://msdn.microsoft.com/en-en/library/system.nullreferenceexception.aspx
尝试取消引用空对象引用时引发的异常。
我完全不明白为什么这些东西在我的 C# 代码中为空?
我已经定义了指向 int[] 数组的 *d 指针,并使用 new[] 运算符为此分配了内存,那么为什么它告诉我,如果内存已经分配,我正在取消引用空对象引用?
还有一个关于在 C# 中显式删除指针的问题。
我知道,它可以用固定来完成,但是如果我想要这个而不使用此关键字?
我记得,我必须为此调用Dispose()方法(但是对于*d,我没有找到此方法),设置为null并调用GC。收集()。这种方式是正确的方法吗?
谢谢
此致敬意!
int *d = (int*)malloc(M * sizeof(int));
为M
int
值分配内存。 d
指向分配的内存。所以它不是一个指针数组,而是一个指向数组的指针。
在 C# 中,可以创建M
int
值数组,并将对该数组的引用存储在变量中,如下所示:
int[] d = new int[M];
d[0] = 0;
数组是一个托管对象;您无需手动释放它、释放它或调用垃圾回收器。
您在代码中看到的 NullReferenceException 是由您尝试取消引用 d[0]
中的指针引起的,该指针由数组创建表达式初始化为null
。