System.OutOfMemoryException при получении массива строк из c ++ на c # - PullRequest
12 голосов
/ 21 июля 2011

Моя функция C ++

    void FillArray(wchar_t** arr)
    {
         // some code
         for(i= 0;i<end;++i)
         {
             wcsncpy(arr[i],InforArray[i],MaxLength);
             count++;
         } 
     }

Моя подпись на C #

[DllImport("Native.dll", CharSet = CharSet.Unicode,EntryPoint = "FillArray")]
        internal static extern void FillArray(
            [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPWStr)] 
            IntPtr[] OutBuff);

И сам код C #:

int maxLen = 256;


int count = GetPropertyCount(ref eData);
IntPtr[] buffer = new IntPtr[count];
for (int i = 0; i < count; i++)
     buffer[i] = Marshal.AllocHGlobal(maxLen);

FillArray(buffer);

string[] output = new string[count];

for (int i = 0; i < count; i++)
{
      output[i] = Marshal.PtrToStringUni(buffer[i]); 
      Marshal.FreeHGlobal(buffer[i]);
}

Данные заполнены без проблем в цикле c ++, но при выходе из FillArray я получил «Произошло необработанное исключение типа« System.OutOfMemoryException »*

Есть идеи, почему?

1 Ответ

2 голосов
/ 22 июля 2011

Учитывая природу исключения, с которым вы сталкиваетесь, программа не пытается выделить память, что происходит в двух местах в вашем примере кода Marshal.AllocHGlobal() и Marshal.PtrToStringUni().Поэтому, если GetPropertyCount() не вернет каким-либо образом Int.MaxValue, программа, скорее всего, завершится сбоем, поскольку wcsncpy не завершит копирование строки нулем.Таким образом, вызов Marshal.PtrToStringUni() выделяет всю память вашего компьютера, пытаясь определить, где на самом деле заканчиваются скопированные строки.Попробуйте использовать PtrToStringUni API, который позволяет указать количество копируемых символов.

...