Освободить память выделенную в С

  1. Есть некая библиотека DLL на C++ которая на запрос клиента в С# заполняет двухбайтовыми символами массив и возвращает адрес первого элемента, клиент C# в свою очередь копирует содержимое в свой буфер который потом уничтожается средствами C# (сборщик мусора).
  2. вот привожу что есть

dll: file string_emplary.cpp:

#include "pch.h"
#include "string_emplary.h"
#include <iostream>
#include <string>

void FillArrayInt(int a[], int n)
{
    const char* b = &"Emplary"[0];

    for (size_t i = 0; i < n; i++)
    {
        a[i] = b[i];
    }
}

wchar_t* Emplary (wchar_t dest[])
{
    /* Wide string literals have a leading L */
    const wchar_t* b = L"Emplary";
    /* This is the wide string version of strcpy */
    wcscpy(dest, b);
    /* This value must not be on the stack */
    return dest;
}

dll: file string_emplary.h:

    #pragma once
    #ifdef string_emplary
    #define string_emplary_API __declspec(dllexport)
    #else
    #define string_emplary_API __declspec(dllimport)
    #endif
    
    extern "C" string_emplary_API void FillArrayInt(int a[], int n);
    extern "C" string_emplary_API wchar_t* Emplary(wchar_t dest[]);

Клиент C# file Form1.cs:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace import_from_cppdll
{
    public unsafe partial class Form1 : Form
    {
        
        [DllImport(@"D:\VLAD\C++\import_DLL\string_emplary\Debug\string_emplary.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void FillArrayInt(int[] a, int n);
       
        
        [DllImport(@"D:\VLAD\C++\import_DLL\string_emplary\Debug\string_emplary.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
    
        public static extern char* Emplary(char[] incoming);

        public Form1()
        {
            InitializeComponent();
        }

        private unsafe void button1_Click(object sender, EventArgs e)
        {
            int b = 8;
            int[] a = new int[8];
            FillArrayInt(a, b);
            string output = "";
            for (int i = 0; i < 8; ++i)
            {
                output += Convert.ToChar(a[i]); 
            }
                       
            var incoming = new char[8];          
            char* outBuf = Emplary(incoming);
            for (int i = 0; i < incoming.Length; i++)
            {
                incoming[i] = outBuf[i];
            }
            

        }
    }
}
  1. Вот так все уничтожается в С# , нет утечек памяти:

введите сюда описание изображения

  1. На что мне было выдано замечание, что -цитата

"Если память была выделена в C, ее необходимо освободить в C. C# ничего не знает о том, что вы сделали в C. Простой способ - сохранить память, выделенную в односвязном списке, и вызвать процедуру освобождения, когда вы закончите. Помните, что ваш C# небезопасен, т.е. управление памятью обрабатывается чем-то другим"

  1. так собственно вопрос, как я понял мне необходимо вызвать процедуру освобождения памяти. как это все мне сделать?

Ответы (0 шт):