Подтвердить что ты не робот

System.OutOfMemoryException при получении строкового массива из С++ на С#

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

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

Моя подпись С#

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

И сам код С#:

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

Данные заполняются без проблем в цикле С++, но при выходе из FillArray я получил "Необработанное исключение типа" System.OutOfMemoryException "произошло

Любые идеи, почему?

4b9b3361

Ответ 1

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