0

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

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

4

1 回答 1

1

如果您需要在使用之前将数据排队,我可能会使用托管容器来做到这一点。您将两个字符串称为“键”和“值”,键是唯一的吗?如果是这样,请使用托管的Dictionary<String^, String^>. 如果不是,请使用 a List<KeyValuePair<String^, String^>>,并在调用 Commit() 时将所有转换为非托管字符串。

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

于 2012-07-31T00:20:58.717 回答