Управление памятью импортированных методов c++ в c#

У меня есть приложение Windows Forms, которое импортирует и использует некоторые методы C++ из user32.dll.

    [DllImport("user32.dll")]
    public static extern IntPtr WindowFromPoint(int xPoirnt, int yPoint);
    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(String sClassName, String sAppName);
    [DllImport("user32.dll")]
    public static extern IntPtr FindWindowEx(IntPtr parentHandel, IntPtr childAfter, String sClassName, String windowTitle);
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    [DllImport("user32.dll")]
    public static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
    [DllImport("user32.dll")]
    public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
    [DllImport("user32.dll")]
    public static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags);
    [DllImport("msvcrt.dll")]
    private static extern int memcmp(IntPtr b1, IntPtr b2, long count);

Я заметил, что после того, как мое приложение будет работать в течение длительного периода времени, использование памяти может увеличиться до 500 ~ МБ (начальные 5 МБ).

У меня не так много опыта работы с C++, но я знаю, что вам нужно вручную управлять памятью для C++.

У меня такой вопрос: нужно ли мне управлять памятью для моего приложения, или сборщик мусора C# справится с этим?

«но я знаю, что вам нужно вручную управлять памятью для C++» - в «старые старые добрые времена» вам более или менее было необходимо. Но в наши дни у нас есть интеллектуальные указатели (std::unique_ptr, std::shared_ptr и std::weak_ptr), а также соответствующие классы контейнеров, поэтому ручное управление памятью (и связанные с ним утечки) в значительной степени ушли в прошлое (но только если вы воспользуетесь преимуществами и использовать этими возможностями в C++ 14.11.17 конечно - но ты В самом деле должен).

Jesper Juhl 10.08.2018 19:14

Из памяти большинство этих функций не нуждаются в управлении памятью; Ярким контрпримером является PrintWindow (он использует DC!). Однако лучше всего заглянуть в вики pinvoke.net и просмотреть примеры для каждой функции. Кроме того, с любым приложением Windows Forms вам нужно позаботиться об удалении всех фрагментов в вашем приложении. Еще вы можете сделать вызов GC.Collect в отладочных сборках вашего приложения (после некоторого события). Сравнивайте только только что обработанные сборкой памяти следы памяти. Приложения .NET со временем приобретают естественный профиль памяти «пилы».

Flydog57 10.08.2018 20:10
0
2
43
0

Другие вопросы по теме