首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何制作PInvoke SafeHandle for VirtualAlloc

如何制作PInvoke SafeHandle for VirtualAlloc
EN

Stack Overflow用户
提问于 2013-10-06 03:03:42
回答 1查看 413关注 0票数 1

我正试图找到一种方法,让VirtualAlloc的pinvoke签名返回一个PageAlignedBuffer。我遇到的问题是,我不能有一个默认的构造函数,因为VirtualFree方法需要知道缓冲区大小,所以我必须在构造函数中提供它。出于这个原因,我采用了下面的方法,只需在构造函数中调用VirtualAlloc。

有人能找到解决这个问题的方法吗?这样我就可以从pinvoke调用中返回一个PageAlignedBuffer了吗?如果不是,这是一个好的解决方案,您认为它有安全或内存泄漏的问题吗?谢谢。

代码语言:javascript
复制
[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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-06 05:06:41

我认为当您在dwSize中调用VirtualFree时,应该将0作为ReleaseHandle正如在MSDN上提到的

如果dwFreeType参数为MEM_RELEASE,则该参数必须为0(零)。该函数释放对VirtualAlloc的初始分配调用中保留的整个区域。

因此,您不需要存储_bufferSize,但是仍然需要从SafeBuffer派生一个类,因为SafeBuffer是一个抽象类,它要求您在派生类中实现ReleaseHandle,以处理特定的资源类型。这样,您的PageAlignedBuffer就是一个托管类,您就不能让VirtualAlloc API返回它的一个实例,也不能强制转换到它的非托管指针。所以,你剩下的代码在我看来不错。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19204988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档