Определите, какая DLL выделена IntPtr - PullRequest
1 голос
/ 17 ноября 2011

Я работаю в системе, которая использует IntPtr, возвращенный из двух отдельных библиотек C ++.Неуправляемая память освобождается путем вызова метода OBJECT_FREE, представленного в каждой DLL.

К сожалению, часть кода теряет отслеживание того, какая DLL изначально выделяла память.Это приводит к нарушению доступа, так как мы перешли на Win7 (по какой-то причине нам это сходит с рук на WinXP).

В среднесрочной перспективе мне придется свернуть каждый IntPtr, чтобы разобраться с этим, но в краткосрочной перспективе, есть ли способ определить, какой DLL выделил память изначально?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Нет - IntPtr - это просто обертка вокруг целого числа (на самом деле указатель) - нет никаких дополнительных метаданных, и, очевидно, невозможно определить только по числу, откуда они пришли.

Есливам нужно освободить память, связанную с IntPtr, тогда я рекомендую вам реализовать безопасный дескриптор для каждой из ваших двух отдельных библиотек C ++ DLL и изменить вместо них вызовы PInvoke, чтобы использовать безопасные дескрипторы, например:

internal class FirstDllSafeHandle : SafeHandleZeroOrMinusOneIsInvalid
{
    private MySafeFileHandle()
        : base(true)
    {
    }

    override protected bool ReleaseHandle()
    {        
        return NativeMethods.FirstDll_OBJECT_FREE(handle);
    }
}

internal class NativeMethods
{
    [DllImport("whatever.dll")]
    public static extern void FirstDll_OBJECT_FREE(FirstDllSafeHandle handle);
    [DllImport("whatever.dll")]
    public static extern void FirstDll_GetObject(out FirstDllSafeHandle handle);

    [DllImport("whatever.dll")]
    public static extern void SecondDll_OBJECT_FREE(SecondDllSafeHandle handle);
    [DllImport("whatever.dll")]
    public static extern void SecondDll_GetObject(out SecondDllSafeHandle handle);
}

Использование безопасных дескрипторов вместо IntPtr предлагает ряд других преимуществ, а также плавное отслеживание правильного способа освобождения ресурсов, связанных с IntPtr.

См. эта статья блога MSDN о безопасных ручках, чтобы узнать больше.

1 голос
/ 17 ноября 2011

Учитывая только IntPtr, невозможно определить, какой неуправляемой библиотеке был выделен этот кусок памяти.

...