我正试图找到一种方法,让VirtualAlloc的pinvoke签名返回一个PageAlignedBuffer。我遇到的问题是,我不能有一个默认的构造函数,因为VirtualFree方法需要知道缓冲区大小,所以我必须在构造函数中提供它。出于这个原因,我采用了下面的方法,只需在构造函数中调用VirtualAlloc。
有人能找到解决这个问题的方法吗?这样我就可以从pinvoke调用中返回一个PageAlignedBuffer了吗?如果不是,这是一个好的解决方案,您认为它有安全或内存泄漏的问题吗?谢谢。
[SecurityCritical]
public sealed class PageAlignedBuffer : SafeBuffer
{
private readonly UIntPtr _bufferSize = UIntPtr.Zero;
public PageAlignedBuffer(long bufferSize) : base(true)
{
_bufferSize = checked ((UIntPtr) bufferSize);
this.handle = WinAPI.VirtualAlloc(IntPtr.Zero, _bufferSize, AllocationType.RESERVE | AllocationType.COMMIT, MemoryProtection.READWRITE);
}
[SecurityCritical]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
protected override bool ReleaseHandle()
{
return WinAPI.VirtualFree(this.handle, _bufferSize, FreeType.Release);
}
}发布于 2013-10-06 05:06:41
我认为当您在dwSize中调用VirtualFree时,应该将0作为ReleaseHandle,正如在MSDN上提到的:
如果dwFreeType参数为MEM_RELEASE,则该参数必须为0(零)。该函数释放对VirtualAlloc的初始分配调用中保留的整个区域。
因此,您不需要存储_bufferSize,但是仍然需要从SafeBuffer派生一个类,因为SafeBuffer是一个抽象类,它要求您在派生类中实现ReleaseHandle,以处理特定的资源类型。这样,您的PageAlignedBuffer就是一个托管类,您就不能让VirtualAlloc API返回它的一个实例,也不能强制转换到它的非托管指针。所以,你剩下的代码在我看来不错。
https://stackoverflow.com/questions/19204988
复制相似问题