防止在重新初始化时出现内存泄漏
本文关键字:内存 泄漏 初始化 | 更新日期: 2023-09-27 17:50:27
我有一个类,可以打开内存映射文件,读取和写入:
public class Memory
{
protected bool _lock;
protected Mutex _locker;
protected MemoryMappedFile _descriptor;
protected MemoryMappedViewAccessor _accessor;
public void Open(string name, int size)
{
_descriptor = MemoryMappedFile.CreateOrOpen(name, size);
_accessor = _descriptor.CreateViewAccessor(0, size, MemoryMappedFileAccess.ReadWrite);
_locker = new Mutex(true, Guid.NewGuid().ToString("N"), out _lock);
}
public void Close()
{
_accessor.Dispose();
_descriptor.Dispose();
_locker.Close();
}
public Byte[] Read(int count, int index = 0, int position = 0)
{
Byte[] bytes = new Byte[count];
_accessor.ReadArray<Byte>(position, bytes, index, count);
return bytes;
}
public void Write(Byte[] data, int count, int index = 0, int position = 0)
{
_locker.WaitOne();
_accessor.WriteArray<Byte>(position, data, index, count);
_locker.ReleaseMutex();
}
通常我这样使用:
var data = new byte[5];
var m = new Memory();
m.Open("demo", sizeof(data));
m.Write(data, 5);
m.Close();
我想实现某种类型的延迟加载打开,并希望打开文件只有当我准备写一些东西,例如:
public void Write(string name, Byte[] data, int count, int index = 0, int position = 0)
{
_locker.WaitOne();
Open(name, sizeof(byte) * count); // Now I don't need to call Open() before the write
_accessor.WriteArray<Byte>(position, data, index, count);
_locker.ReleaseMutex();
}
问题:当我调用"写"方法几次(在循环中),它会导致成员变量(如_locker)重新初始化,我想知道-这样做是安全的吗,它会导致内存泄漏或不可预测的行为与互斥?
如果在写方法中使用锁打开,那么在释放互斥锁之前关闭是安全的。
在处理非托管资源和一次性对象时,正确实现IDispose接口总是更好。这里有更多的信息。
你可以在using子句中初始化内存实例
using (var m = new Memory())
{
// Your read write
}