Освободить память выделенную в С
- Есть некая библиотека DLL на C++ которая на запрос клиента в С# заполняет двухбайтовыми символами массив и возвращает адрес первого элемента, клиент C# в свою очередь копирует содержимое в свой буфер который потом уничтожается средствами C# (сборщик мусора).
- вот привожу что есть
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];
}
}
}
}
- Вот так все уничтожается в С# , нет утечек памяти:
- На что мне было выдано замечание, что -цитата
"Если память была выделена в C, ее необходимо освободить в C. C# ничего не знает о том, что вы сделали в C. Простой способ - сохранить память, выделенную в односвязном списке, и вызвать процедуру освобождения, когда вы закончите. Помните, что ваш C# небезопасен, т.е. управление памятью обрабатывается чем-то другим"
- так собственно вопрос, как я понял мне необходимо вызвать процедуру освобождения памяти. как это все мне сделать?
