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

Frog1228 2011-03-22 05:34:42
如题,unsafe和fixed可以用于在类的字段中定义指针吗?另外在C#中用什么删除释放指针,我用了下delete,编译器不识。
...全文
256 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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创建的都不用手动释放。

111,098

社区成员

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

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

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