.NET删除已分配的缓冲区
我有以下代码来分配缓冲区.NET删除已分配的缓冲区,.net,memory,c++-cli,allocation,.net,Memory,C++ Cli,Allocation,我有以下代码来分配缓冲区 uns16 m_rawBuffer = new uns16[m_rawBufferSize]; pin_ptr<uns16> ptrAcqBuffer = m_rawBuffer; uns16 m_rawBuffer=新的uns16[m_rawBufferSize]; pin_ptr ptrAcqBuffer=m_rawBuffer; 虽然是pin_ptr,但GC会不时修改ptrAcqBuffer 我明白了 固定指针是防止对象移动的内部指针 指向从垃圾收
uns16 m_rawBuffer = new uns16[m_rawBufferSize];
pin_ptr<uns16> ptrAcqBuffer = m_rawBuffer;
uns16 m_rawBuffer=新的uns16[m_rawBufferSize];
pin_ptr ptrAcqBuffer=m_rawBuffer;
虽然是pin_ptr,但GC会不时修改ptrAcqBuffer
我明白了
固定指针是防止对象移动的内部指针
指向从垃圾收集堆上移动。就是
公共语言不会更改固定指针的值
运行时。当您传递托管类的地址时,这是必需的
到非托管函数,以便地址不会更改
在非托管函数调用的解析过程中发生意外
这对我来说没有意义。。。有人能解释一下吗?
还因为我用“new”创建了m_rawBuffer,所以我需要“pin_ptr”吗
谢谢。每当垃圾收集器执行垃圾收集时,它都会移动托管堆上的所有对象。这是其正常运行的一部分。这就是为什么指向托管对象的“常规”指针无效的原因,因为垃圾收集器可以随时移动它 pin指针将托管堆上的对象标记为“不要移动我!”,因此只要
pin\u ptr
对象存在,指针就保持有效。然后可以将pin指针传递给需要常规原始指针的方法,并且它所指向的对象在pin_ptr
对象被销毁之前不会移动
所有这些都与托管堆有关。假设显示的代码片段是C++/CLI代码,则使用new
在常规非托管堆上分配数组。不需要固定,它不会自行移动
如果您执行了array^buffer=gcnewarray(m_rawBufferSize)代码>,则需要pin码
…GC不时修改ptrAcqBuffer
我不知道那里发生了什么事。我不确定当您尝试给它一些最初不在托管堆上的东西时,pin_ptr
会做什么,因此可能会出现奇怪的行为。既然你不需要别针,我就不用担心了