through_and take a mutable reference as well as a mapping
function to change the provided reference. They do this by calling
on the reference which duplicates ownership and then calling the mapping
If the mapping function panics, both the original object and the one
ptr::read get dropped, causing a double free.