Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Você pode acessar caracteres de um String objeto para chamadas de alto desempenho para funções não gerenciadas que usam wchar_t* cadeias de caracteres. O método produz um ponteiro interno para o primeiro caractere do objeto String. Esse ponteiro pode ser manipulado diretamente ou ser fixado e passado para uma função que espera uma cadeia de caracteres convencional wchar_t.
Exemplos
PtrToStringCharsretorna um Char, que é um ponteiro interior (também conhecido como byref). Como tal, está sujeita a recolha de lixo. Você não precisa fixar esse ponteiro, a menos que vá passá-lo para uma função nativa.
Considere o código a seguir. A fixação não é necessária porque ppchar é um ponteiro interior e, se o coletor de lixo mover a cadeia de caracteres para a qual aponta, ele também atualizará ppchar. Sem um pin_ptr (C++/CLI), o código funcionará e não terá o potencial impacto de desempenho causado pela fixação.
Se você passar ppchar para uma função nativa, então ela deve ser um ponteiro de fixação, o coletor de lixo não será capaz de atualizar nenhum ponteiro no quadro de pilha não gerenciado.
// PtrToStringChars.cpp
// compile with: /clr
#include <vcclr.h>
using namespace System;
int main() {
String ^ mystring = "abcdefg";
interior_ptr<const Char> ppchar = PtrToStringChars( mystring );
for ( ; *ppchar != L'\0'; ++ppchar )
Console::Write(*ppchar);
}
abcdefg
Este exemplo mostra onde a fixação é necessária.
// PtrToStringChars_2.cpp
// compile with: /clr
#include <string.h>
#include <vcclr.h>
// using namespace System;
size_t getlen(System::String ^ s) {
// Since this is an outside string, we want to be secure.
// To be secure, we need a maximum size.
size_t maxsize = 256;
// make sure it doesn't move during the unmanaged call
pin_ptr<const wchar_t> pinchars = PtrToStringChars(s);
return wcsnlen(pinchars, maxsize);
}
int main() {
System::Console::WriteLine(getlen("testing"));
}
7
Um ponteiro interior tem todas as propriedades de um ponteiro C++ nativo. Por exemplo, você pode usá-lo para percorrer uma estrutura de dados vinculada e fazer inserções e exclusões usando apenas um ponteiro:
// PtrToStringChars_3.cpp
// compile with: /clr /LD
using namespace System;
ref struct ListNode {
Int32 elem;
ListNode ^ Next;
};
void deleteNode( ListNode ^ list, Int32 e ) {
interior_ptr<ListNode ^> ptrToNext = &list;
while (*ptrToNext != nullptr) {
if ( (*ptrToNext) -> elem == e )
*ptrToNext = (*ptrToNext) -> Next; // delete node
else
ptrToNext = &(*ptrToNext) -> Next; // move to next node
}
}