【发布时间】:2018-09-11 10:38:23
【问题描述】:
开发环境:Win32桌面应用C++/CLI
让我们有一个这样的数组:
array<String^>^ strArr = gcnew array<String^>(100);
也是这样的数组:
void* ptrArr[100];
我必须将第一个数组的所有元素复制到第二个数组。如何做到这一点?
【问题讨论】:
标签: arrays type-conversion c++-cli
开发环境:Win32桌面应用C++/CLI
让我们有一个这样的数组:
array<String^>^ strArr = gcnew array<String^>(100);
也是这样的数组:
void* ptrArr[100];
我必须将第一个数组的所有元素复制到第二个数组。如何做到这一点?
【问题讨论】:
标签: arrays type-conversion c++-cli
我假设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,并展示了如何使用它的一个很好的例子。李>
【讨论】: