2015-05-23 6 views
0

У меня есть класс, который может открыть файлы, отображенные на память, читать и писать:утечки Предохраняйте карту памяти на повторную инициализацию

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(); 
    } 

Вопрос: когда я называю «Write» метод несколько раз (в цикле) это вызовет переменные-члены (как _locker) для повторной инициализации, и я хотел бы знать, - это безопасно, чтобы сделать это таким образом, может ли это вызвать утечку памяти или непредсказуемое поведение с помощью мьютекса?

+0

https://msdn.microsoft.com/en-us/library/dd642331%28v=vs.110%29.aspx –

ответ

0

Если вы открываете метод записи с помощью блокировки, безопасно закрыть, прежде чем вы отпустите мьютекс.

Когда вы имеете дело с неуправляемыми ресурсами и одноразовым объектом, всегда лучше реализовать интерфейс IDispose правильно. Here is some more information.

Затем вы можете initialse экземпляр памяти в использовании пункта

using (var m = new Memory()) 
{ 
// Your read write 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^