开发环境:Win32桌面应用程序C ++ / CLI
让我们有一个像这样的数组:
array<String^>^ strArr = gcnew array<String^>(100);
也是这样的数组:
void* ptrArr[100];
我必须将所有第一个数组的元素复制到第二个数组。该怎么做?
答案 0 :(得分:1)
我假设void* ptrArr[100]
实际上是const char* ptrArr[100]
。 void*
实际上可以是任何东西,因此如果不对类型进行假设,就无法回答问题。
因此,您在这里需要两件事:您需要在类型之间进行转换(包括从Unicode代码点到ANSI字符),并且需要拥有一些内存。
对于const char*
保留非托管内存的内容,有几种选择。最自己动手的路线是Marshal.StringToHGlobalAnsi
,但这很痛苦,因此我们将跳过它。 (这将需要手动跟踪一堆IntPtr
,并在完成后手动调用FreeHGlobal
。)
其他选择是marshal_as
的不同调用。
您可以将所有String^
实例转换为std::string
实例,然后将其中的const char*
拔出。我为此推荐marshal_as<std::string>
。在这种情况下,该存储器归std:string
实例所有,因此ptrArr
仅在stdStrArr
有效期内才有效。
#include <msclr\marshal_cppstd.h>
array<String^>^ strArr = gcnew array<String^>(100);
std::string stdStrArr[100];
const char* ptrArr[100];
for (size_t i = 0; i < 100; i++)
{
stdStrArr[i] = marshal_as<std::string>(strArr[i]);
ptrArr[i] = stdStrArr[i].c_str();
}
// Memory for ptrArr deallocated when stdStrArr goes out of scope.
另一种选择是使用marshal_as
直接转换为const char*
。为此,您分配一个辅助对象。在这种情况下,该内存归marshal_context
实例所有,因此ptrArr
仅在context
有效期内才有效。
#include <msclr\marshal.h>
array<String^>^ strArr = gcnew array<String^>(100);
marshal_context^ context = gcnew marshal_context();
char* ptrArr[100];
for (size_t i = 0; i < 100; i++)
{
ptrArr[i] = context->marshal_as<const char*>(strArr[i]);
}
// Memory for ptrArr deallocated when you call `delete context`, or when it's garbage collected.
进一步阅读:
marshal_context::marshal_as
(显示使用marshal_context
的示例。)注释:
marshal_as
,并展示了如何使用它的一个很好的例子。