【发布时间】:2011-08-25 13:14:19
【问题描述】:
在 C++/CLI 中,将字符串数组转换为本机 char** 的最有效方法是什么?
我正在这样做:
array<String^>^ tokenArray = gcnew array<String^> {"TokenONE", "TokenTWO"};
int numTokens = tokenArray->Length;
char** ptr = new char* [numTokens];
for(int i = 0; i < numTokens; i++)
{
// See: http://stackoverflow.com/questions/6596242/
array<Byte>^ encodedBytes = Text::Encoding::UTF8->GetBytes(tokenArray[i]);
pin_ptr<Byte> pinnedBytes = &encodedBytes[0];
ptr[i] = reinterpret_cast<char*>(pinnedBytes);
}
int myResult = someNativeFunction(ptr, numTokens);
delete ptr;
// ...
什么,如果有什么需要改进的话?从内存管理的角度来看,这可以吗?如果需要,我可以更改someNativeFunction 的参数。
谢谢。
【问题讨论】:
-
“可以改进的地方”——可能根本不使用手动内存管理和指针,而是在本机端使用
std::strings。 -
一个主要问题是您的
pin_ptrs 在您使用它们之前就超出了范围。 -
我对你为什么需要 tokenArray 有点困惑。既然你不使用它,为什么不直接让 ptr 指向 C 风格的字符串呢?即使你在使用它,既然它看起来不是动态的,而且很小,那你为什么不单独创建ptr呢?
-
重申 DarkFalcon 所说的,您将
someNativeFunction指针传递给未初始化的内存,这将导致内存损坏。 -
@OG :不,这不会改变任何事情——你的
pin_ptrs 在for循环的每次迭代中都超出范围,取消固定它们的内容,所以当你打电话的时候someNativeFunctionptr的每个元素都指向随机数据。