상세 컨텐츠

본문 제목

C# 동적메모리 할당

C#

by 탑~! 2018. 7. 4. 10:07

본문


C# 동적메모리 할당


using System;
using System.Runtime.InteropServices;
 
public unsafe class Memory
{
   // Handle for the process heap. This handle is used in all calls to the
   // HeapXXX APIs in the methods below.
   static int ph = GetProcessHeap();
 
   // Private instance constructor to prevent instantiation.
   private Memory() {}
 
   // Allocates a memory block of the given size. The allocated memory is
   // automatically initialized to zero.
   public static void* Alloc(int size) {
      void* result = HeapAlloc(ph, HEAP_ZERO_MEMORY, size);
      if (result == nullthrow new OutOfMemoryException();
      return result;
   }
 
   // Copies count bytes from src to dst. The source and destination
   // blocks are permitted to overlap.
   public static void Copy(void* src, void* dst, int count) {
      byte* ps = (byte*)src;
      byte* pd = (byte*)dst;
      if (ps > pd) {
         for (; count != 0; count--*pd++ = *ps++;
      }
      else if (ps < pd) {
         for (ps += count, pd += count; count != 0; count--*--pd = *--ps;
      }
   }
 
   // Frees a memory block.
   public static void Free(void* block) {
      if (!HeapFree(ph, 0, block)) throw new InvalidOperationException();
   }
 
   // Re-allocates a memory block. If the reallocation request is for a
   // larger size, the additional region of memory is automatically
   // initialized to zero.
   public static void* ReAlloc(void* block, int size) {
      void* result = HeapReAlloc(ph, HEAP_ZERO_MEMORY, block, size);
      if (result == nullthrow new OutOfMemoryException();
      return result;
   }
 
   // Returns the size of a memory block.
   public static int SizeOf(void* block) {
      int result = HeapSize(ph, 0, block);
      if (result == -1throw new InvalidOperationException();
      return result;
   }
 
   // Heap API flags
   const int HEAP_ZERO_MEMORY = 0x00000008;
 
   // Heap API functions
   [DllImport("kernel32")]
   static extern int GetProcessHeap();
 
   [DllImport("kernel32")]
   static extern void* HeapAlloc(int hHeap, int flags, int size);
 
   [DllImport("kernel32")]
   static extern bool HeapFree(int hHeap, int flags, void* block);
 
   [DllImport("kernel32")]
   static extern void* HeapReAlloc(int hHeap, int flags,
      void* block, int size);
    
   [DllImport("kernel32")]
   static extern int HeapSize(int hHeap, int flags, void* block);
}



Memory.cs



출처: http://codingcoding.tistory.com/491?category=735724 [코딩 기록]



예제

class Test
{
   static void Main() {
      unsafe {
         byte* buffer = (byte*)Memory.Alloc(256);
         try {
            for (int i = 0; i < 256; i++) buffer[i] = (byte)i;
            byte[] array = new byte[256];
            fixed (byte* p = array) Memory.Copy(buffer, p, 256); 
         }
         finally {
            Memory.Free(buffer);
         }
         for (int i = 0; i < 256; i++Console.WriteLine(array[i]);
      }
   }
}



출처: http://codingcoding.tistory.com/491?category=735724 [코딩 기록]

'C#' 카테고리의 다른 글

LiteDB - .Net, IOS, Android, Windows Phone  (0) 2018.07.04
대용량 텍스트 파일 읽기  (0) 2018.07.04
[.Net 4.5] 2Gb 이상 메모리 사용 하기  (0) 2018.07.03
확장자에 대한 기본프로그램 등록  (0) 2018.06.29
웹 크롤링  (0) 2018.06.29

관련글 더보기