I said that the problem was in AdaptiveClassifierIsEmpty because Windows dumped the state of the process when the read-access violation occurred, and
AdaptiveClassifierIsEmpty was the currently-executing function at the top of the call stack. This was deep within a call to the public function Recognize.
I have since found these problems:
1. During the Init call, if the eng.traineddata file is not found, then init_tesseract_lang_data called tprintf with an error message and then returned -1. At this point, AdaptedTemplates is still a null pointer because its object is allocated later. I believe that this is not a bug.
2. We were not getting the error message generated by tprintf. We have our own version of tprintf that sprintf's to a string (which is sent to a searchable logging system) rather than fprintf's to stderr. But our own version wasn't getting linked in so the error message was lost. I believe that this is a bug on our side.
3. We were calling Init but not checking the return value. It appears to have returned -1 and we ignored it and called Recognize anyway. I believe that this is a bug on our side.
I have resolved the bugs in 2 and 3 and things seem to be normal again.
Thank you for your time.