Is the free() method being called inadvertently on my DataObject?
I was not aware that the system had been patched with https://github.com/civicrm/civicrm-core/pull/10844/files. Reversing the patch resolved the problem.