Ich habe den folgenden Code in C++/CLI und Beobachten hängen, während die .net-String Umwandlung * auf char StringToCoTaskMemAnsi mitStringToCoTaskMemUni oder StringToCoTaskMemAnsi-Methoden können dazu führen, dass hängen?
const char* CDICashInStringStore::CDIGetStringVal(void)
{
unsigned int identifier = (unsigned int)_id;
debug(" cashincdistores--routing call to .Net for CDI String %d", identifier);
NCR::APTRA::INDCDataAccess::IStringValue^ stringValueProvider = (NCR::APTRA::INDCDataAccess::IStringValue^)GetStringProvider()->GetProvider();
String^ strValue = stringValueProvider->GetStringValue(identifier);
debug(" cashincdistores-- going to call StringToCoTaskMemAnsi);
IntPtr iPtr = Marshal::StringToCoTaskMemAnsi(strValue);
debug(" cashincdistores-- StringToCoTaskMemAnsi called);
// use a local (retVal is not needed)
const char * ansiStr = strdup((const char *) iPtr.ToPointer());
Marshal::FreeCoTaskMem(iPtr);
debug(" cashincdistores--got results %d %s",identifier,ansiStr);
// The returned memory will be free() 'ed by the user
return ansiStr;
}
In unserer Protokollierung kann ich „cashincdistores-- gehen zu nennen StringToCoTaskMemAnsi“ sehen und es zu ahnen, ist ein Hang nach dem Aufruf der "StringToCoTaskMemAnsi" -Methode.
Gibt es eine Möglichkeit, in der 'StringToCoTaskMemAnsi'-Marshalling-Methode hängen. Was könnte den Hang verursachen?
Haben Sie das mit dem Debugger durchgegangen, oder haben Sie nur das Printf-Debugging durchgeführt? Was passiert, wenn Sie durch diese Linie gehen? –
Danke David für deine Antwort. Beim Debuggen wird nicht gehangen und darüber hinaus passiert es sehr selten (1 von 50) – Sadhu
Sicher, das ist möglich. Sie können die Sperre sperren, die den Heap schützt, wenn Sie etwas Unkluges tun, wie das Einfangen von SEH-Exceptions. Oder grundlegende Heap-Korruption kann dazu führen, dass der Allokator in einer Endlosschleife stecken bleibt. Fiese Probleme, keine One-Button-Fixes - es antwortet. –