When a diskread activity is created in place of a workunit read, one of the virtual calls to the helper is made using the wrong virtual table (it's using the original activity helper pointer, but cast to a IHThorDiskReadBaseArg, which it is not).
Revealed when VMT of IHThorDiskReadBaseArg changed, and the random function being called started to be a destructor.