我正在围绕 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扩展内存的最佳方法是什么?对于这种情况,我将不胜感激任何指向一个好的设计解决方案的指针。