将托管数据转换并保留在内存中一段时间

时间:2012-07-30 22:46:43

标签: memory-management c++-cli managed unmanaged-memory

我正在围绕C ++项目编写C ++ / cli包装器,以便我可以从C#调用它。 C#端调用cli方法[比如说Put(String ^ key,String ^ value)]数百万次传递一大堆键/值托管数据,接着是另一个调用[比如说Commit()]来询问C ++对象对数据做一些事情。我需要能够将所有数据保存在内存中直到最后一次调用 - 所以我使用std :: vector并尝试将所有托管的字符串转换为非托管的std :: string并将它们保存在我的cli中的向量中代码。

我的问题是 - 在这种情况下,转换托管数据的最佳方法是什么?固定托管数据以保持非托管指针有效似乎非常糟糕,因为数据没有立即使用(如果固定在函数调用后立即超出范围,这将无法工作 - 这会导致访问声音)。另一个选择是通过malloc分配一个“足够大”的缓冲区并继续向其添加数据 - 如果更好的话,那么:(1)是pin-ptr后跟memcpy(一旦Put方法,引脚就会超出范围返回)转换/复制单个String ^数据的最佳方法? (2)因为我不知道maloc的总体大小,从最初的malloc扩展内存的最佳方法是什么?我很感激任何指向这种情况的优秀设计解决方案的指针。

1 个答案:

答案 0 :(得分:1)

如果您需要在使用数据之前对数据进行排队,我可能会使用托管容器来执行此操作。你调用了两个字符串'key'和'value',键是唯一的吗?如果是,请使用托管Dictionary<String^, String^>。如果没有,请使用List<KeyValuePair<String^, String^>>,并在调用Commit()时将所有转换执行到非托管字符串。

当调用Commit()时,你可以做一个大的malloc来保存所有单独的字符串,或者你可以单独转换每个字符串,使用许多单独的malloc(或其他分配方法)。只要你在所有情况下都正确释放内存,要么都应该正常工作。