Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET删除已分配的缓冲区_.net_Memory_C++ Cli_Allocation - Fatal编程技术网

.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
会做什么,因此可能会出现奇怪的行为。既然你不需要别针,我就不用担心了