У меня есть ниже код в C++/CLI и наблюдения зависать при преобразовании строки .net обугливаться * с помощью StringToCoTaskMemAnsiСпособы StringToCoTaskMemUni или StringToCoTaskMemAnsi могут вызвать зависание?
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;
}
В нашем протоколирования я могу видеть «cashincdistores-- позвоню StringToCoTaskMemAnsi» и заподозрить там является зависанием после вызова метода StringToCoTaskMemAnsi.
Есть ли возможность повесить метод сортировки 'StringToCoTaskMemAnsi'. что может повредить?
Вы прошли через это с помощью отладчика, или вы только сделали отладку printf? Что происходит, когда вы проходите через эту линию? –
Спасибо, Дэвид за ваш ответ. Hang не происходит во время отладки и, кроме того, происходит очень редко (1 из 50 раз) – Sadhu
Конечно, это возможно. Вы можете заблокировать блокировку, которая защищает кучу, если вы сделаете что-нибудь неразумное, как ловушки исключений SEH. Или базовое повреждение кучи может заставить распределитель застрять в бесконечном цикле. Неприятные проблемы, ни одна кнопка-исправления, - отвечает он. –