【问题标题】:Deleting a uint8_t array defined with first pointer and number of elements删除使用第一个指针和元素数定义的 uint8_t 数组
【发布时间】:2016-02-27 00:58:47
【问题描述】:

我正在从我的 C# 程序中调用一个 c++ dll。看来,一旦将变量传递给非托管代码,C# 就不想与它有任何关系,因此我的程序正在疯狂地泄漏内存。

这是代码的 C# 部分:

    byte[] bytes = MyData;
    int array_lenght = bytes.Length;
    DataProcessor(bytes, array_lenght);

DataProcessor 定义为

[DllImport("Processor", EntryPoint = "DataProcessor")]
public static extern void DataProcessor(byte[] array, int ArrayElementCount);

这是 DataProcessor 函数的 DLL 端:

void DataProcessor (uint8_t* InputArray, int ArrayElementCount)
// do some stuff here

现在看来我需要从 DLL 中删除这个数组(InputArray),但是我找不到这样做的方法。我试过像

delete *(InputArray + i) // inside a for loop

并将数组映射到这样的向量并清除它

std::vector<uint8_t> fckn_vector(InputArray, InputArray + ArrayElementCount);
fckn_vector.clear();

我 100% 确定一定有一种非常简单的方法可以做到这一点,但是我不擅长 C++。

【问题讨论】:

  • 我不是互操作专家,但至少我认为在非托管端删除托管对象将是一个的想法。
  • 另外,您可能想要固定您的阵列。 msdn.microsoft.com/en-us/library/f58wzh21.aspx
  • 向我们展示您在 C# 端的 DataProcesor 方法的定义。
  • @Luaan 添加了定义
  • 好的,在这种情况下,你绝对不应该删除数组——它是由编组器处理的。为什么你认为有内存泄漏?你还在 C++ 代码中做什么?您是否同时运行多个DataProcessors?由于数组是 blittable,它应该被固定而不是复制 - 你可能有堆碎片问题吗?尝试使用 CLRProfiler 监控内存布局。

标签: c# c++ arrays pointers


【解决方案1】:

您可以使用Marshal.FreeCoTaskMem 方法:

Marshal.FreeCoTaskMem(InputArray);

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多