public unsafe void PinnedArrayMemoryLifetime() { Memory <byte> copyStoredForLater; var bytes = new byte[1024]; fixed(byte *pBytes = bytes) { using (var owner = new OwnedPinnedArray <byte>(bytes, pBytes)) { Memory <byte> memory = owner.Memory; Memory <byte> memorySlice = memory.Slice(10); copyStoredForLater = memorySlice; using (memorySlice.Reserve()) { Assert.Throws <InvalidOperationException>(() => { // memory is reserved; cannot dispose owner.Dispose(); }); Span <byte> span = memorySlice.Span; span[0] = 255; } } } Assert.Throws <ObjectDisposedException>(() => { // manager is disposed var span = copyStoredForLater.Span; }); }
public unsafe void PinnedArrayMemoryLifetime() { Memory <byte> copyStoredForLater; var bytes = new byte[1024]; fixed(byte *pBytes = bytes) { var owner = new OwnedPinnedArray <byte>(bytes, pBytes); try { Memory <byte> memory = owner.Memory; Memory <byte> memorySlice = memory.Slice(10); copyStoredForLater = memorySlice; var r = memorySlice.Reserve(); try { Assert.Throws <InvalidOperationException>(() => { // memory is reserved; cannot dispose owner.Dispose(); }); Assert.Throws <ObjectDisposedException>(() => { Span <byte> span = memorySlice.Span; span[0] = 255; }); } finally { Assert.Throws <ObjectDisposedException>(() => { // memory has been Disposed, so cannot free reservation r.Dispose(); }); } } finally { Assert.Throws <InvalidOperationException>(() => { // memory is still reserved as Release failed. owner.Dispose(); }); } } Assert.Throws <ObjectDisposedException>(() => { // manager is disposed var span = copyStoredForLater.Span; }); }
public unsafe void PinnedArrayMemoryLifetime() { Memory<byte> copyStoredForLater; var bytes = new byte[1024]; fixed (byte* pBytes = bytes) { using (var owner = new OwnedPinnedArray<byte>(bytes, pBytes)) { Memory<byte> memory = owner.Memory; Memory<byte> memorySlice = memory.Slice(10); copyStoredForLater = memorySlice; using (memorySlice.Reserve()) { Assert.Throws<InvalidOperationException>(() => { // memory is reserved; cannot dispose owner.Dispose(); }); Span<byte> span = memorySlice.Span; span[0] = 255; } } } Assert.Throws<ObjectDisposedException>(() => { // manager is disposed var span = copyStoredForLater.Span; }); }