unsafe和fixed可以用于在类的字段中定义指针吗?另外在C#中用什么删除释放指针

Frog1228 2011-03-22 05:34:42
如题,unsafe和fixed可以用于在类的字段中定义指针吗?另外在C#中用什么删除释放指针,我用了下delete,编译器不识。
...全文
325 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Frog1228 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lizhibin11 的回复:]
使用Marshal.AllocHGlobal来分配制定大小的内存,返回IntPtr,内容被写入后进行操作时,再使用Marshal.Copy从IntPtr中拷贝到定义的数组,或者不用定义数组,直接Marshal.ReadByte读取指定位置的字节,这样可以节省一个数组的内存。最后要调用Marshal.FreeHGlobal释放该内存。
[/Quote]
不好意思,我一直忙得没时间来研究解决这个问题,我确实是这样做的,但是引用和释放的时候确实有问题,一个窗口需要另一个窗口的四个数组内容,我就把这四个数组转化为IntPtr,通过构造函数传递给另一个窗口,再在另一个窗口中通过Marshal.Copy得到对应的数组,但是除得到的第一个数组是可以引用的,其它三个数组引用其中内容就会出错,不过我得到四个数组通过Marshal.Copy是连续用的,是不是连续四次拷贝就会出现问题?而且我释放也有问题,在另一窗口关闭的时候去释放,会报出“句柄无效”的错误。
lizhibin11 2011-04-07
  • 打赏
  • 举报
回复
使用Marshal.AllocHGlobal来分配制定大小的内存,返回IntPtr,内容被写入后进行操作时,再使用Marshal.Copy从IntPtr中拷贝到定义的数组,或者不用定义数组,直接Marshal.ReadByte读取指定位置的字节,这样可以节省一个数组的内存。最后要调用Marshal.FreeHGlobal释放该内存。
Frog1228 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lizhibin11 的回复:]
C# code

[StructLayout(LayoutKind.Sequential)]
class TestClass
{
public byte[] a = new byte[1024 * 1024];
}
class Program
{
static void Main(string[] a……
[/Quote]
你说的我明白了,这几天忙得都没时间回,我后来把类中的字段用Marshal类进行分配和释放内存。得到数组首地址用的是:
Marshal.UnsafeAddrOfPinnedArrayElement
再由IntPtr得到数组用的是:
 Marshal.Copy
但是引用数组内容时就会报出“尝试读取受保护的内存,这通常指示其它内存已损坏。”后来用ToPointer()由IntPtr得到数组首地址,再结合用unsafe不安全代码去引用数组的内容,不过也是同样的问题。我不知道问题出在哪,该如何解决,还有你说直接用调用windows API怎么用啊?帮忙解决,不胜感激,加分。
Frog1228 2011-03-28
  • 打赏
  • 举报
回复
没人来了?在类中定义一个数组的指针字段
 unsafe public double* resultGradient = new double[CallDLL.width * CallDLL.height * 3];
这样做是不是不行?因为编译器报错:右边的初始化和左边的double*不匹配。
Frog1228 2011-03-28
  • 打赏
  • 举报
回复
其实我希望定义的这个数组的大小是CallDLL.width * CallDLL.height * 9,CallDLL.width是2048,CallDLL.height是1536,它在类的字段中,编译是没有问题,但我一旦运行,错误就停留在这个字段上,报出“内存不足”,谁能帮忙解决这个问题,不胜感激,加分!!
kensouterry 2011-03-26
  • 打赏
  • 举报
回复
图像处理啊,这种技术是否太高端了,盲人路过,呵呵……
Frog1228 2011-03-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lizhibin11 的回复:]
C# code

[StructLayout(LayoutKind.Sequential)]
class TestClass
{
public byte[] a = new byte[1024 * 1024];
}
class Program
{
static void Main(string[] a……
[/Quote]
不来了?
Frog1228 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lizhibin11 的回复:]
C# code

[StructLayout(LayoutKind.Sequential)]
class TestClass
{
public byte[] a = new byte[1024 * 1024];
}
class Program
{
static void Main(string[] a……
[/Quote]
我后来看了一下,虚拟内存太低是因为重装了系统之后,系统默认将虚拟内存设为0了,我后来改了一下,就好了,但是数组还会时不时地报出“内存不足”的错误,数组大小是2048*1536*n,n最大要达到9。我觉得这个数组大小太大了。
Frog1228 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lizhibin11 的回复:]
你要代码吧?不过在类中使用指针是多余的,一个引用类型的字段本身存放的就是首地址。struct中使用还有些许意义。

C# code

unsafe class TestClass
{
public int* A;
public TestClass(int[] b)
{
fixed(int* p……
[/Quote]
正好有些数组定义为类中的字段,你能不能告诉我解决这个问题的方法。
Frog1228 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lizhibin11 的回复:]
你要代码吧?不过在类中使用指针是多余的,一个引用类型的字段本身存放的就是首地址。struct中使用还有些许意义。

C# code

unsafe class TestClass
{
public int* A;
public TestClass(int[] b)
{
fixed(int* p……
[/Quote]
因为做的是图像处理,核心算法是用VC做的,我需要定义很多数组来接受这些返回值,数组的大小也很大,最后还要进行三维显示,我在C#中直接定义数组,运行已报出“内存溢出和虚拟内存太低”的错误了,其实我想解决的是这个问题。
lizhibin11 2011-03-23
  • 打赏
  • 举报
回复
你要代码吧?不过在类中使用指针是多余的,一个引用类型的字段本身存放的就是首地址。struct中使用还有些许意义。

unsafe class TestClass
{
public int* A;
public TestClass(int[] b)
{
fixed(int* p = b)
{
A = p;
}
}
}
class Program
{
unsafe static void Main(string[] args)
{
int[] x = new int[10];
TestClass tc = new TestClass(x);
*(tc.A + 1) = 255;
Console.ReadLine();
}
}
Frog1228 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lizhibin11 的回复:]
也是GC释放,只要不是用GcHandle和Marshal.AllocHGlobal创建的都不用手动释放。
[/Quote]
那unsafe和fixed可以用于在类的字段中定义指针吗?
lizhibin11 2011-03-23
  • 打赏
  • 举报
回复

[StructLayout(LayoutKind.Sequential)]
class TestClass
{
public byte[] a = new byte[1024 * 1024];
}
class Program
{
static void Main(string[] args)
{
TestClass tc = new TestClass();
Console.WriteLine(Marshal.SizeOf(tc));
Console.ReadLine();
}
}

运行一下这个,这个包含1M数组的类实例,大小是4个字节。因为字段a本身存放的就是数组首地址,所以你定义成指针也没什么意义,直接定义数组类型就可以。“内存溢出和虚拟内存太低”不是c#的原因,是过程存在问题。你以c++指针的思维去理解c#的引用类型,以c++的new理解c#的new,唯一区别就是c++可以手动delete,c#要靠GC,如果问题发生在GC,不妨尝试Marshal类分配和释放内存或者直接调用windows api。
lizhibin11 2011-03-22
  • 打赏
  • 举报
回复
也是GC释放,只要不是用GcHandle和Marshal.AllocHGlobal创建的都不用手动释放。
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧