@@ -723,11 +723,11 @@ impl DatasetCreate {
723
723
FillValue :: Default | FillValue :: UserDefined => {
724
724
let dtype = Datatype :: from_descriptor ( tp) ?;
725
725
let mut buf: Vec < u8 > = Vec :: with_capacity ( tp. size ( ) ) ;
726
+ h5try ! ( H5Pget_fill_value ( self . id( ) , dtype. id( ) , buf. as_mut_ptr( ) . cast( ) ) ) ;
726
727
unsafe {
727
728
buf. set_len ( tp. size ( ) ) ;
728
729
}
729
- h5try ! ( H5Pget_fill_value ( self . id( ) , dtype. id( ) , buf. as_mut_ptr( ) . cast( ) ) ) ;
730
- Ok ( Some ( unsafe { OwnedDynValue :: from_raw ( tp. clone ( ) , buf) } ) )
730
+ Ok ( Some ( unsafe { OwnedDynValue :: from_raw ( tp. clone ( ) , buf. into_boxed_slice ( ) ) } ) )
731
731
}
732
732
_ => Ok ( None ) ,
733
733
}
@@ -741,11 +741,13 @@ impl DatasetCreate {
741
741
pub fn get_fill_value_as < T : H5Type > ( & self ) -> Result < Option < T > > {
742
742
let dtype = Datatype :: from_type :: < T > ( ) ?;
743
743
Ok ( self . get_fill_value ( & dtype. to_descriptor ( ) ?) ?. map ( |value| unsafe {
744
- let mut out: T = mem:: zeroed ( ) ;
744
+ let mut out: mem :: MaybeUninit < T > = mem:: MaybeUninit :: uninit ( ) ;
745
745
let buf = value. get_buf ( ) ;
746
- ptr:: copy_nonoverlapping ( buf. as_ptr ( ) , ( & mut out as * mut T ) . cast ( ) , buf. len ( ) ) ;
747
- mem:: forget ( value) ;
748
- out
746
+ ptr:: copy_nonoverlapping ( buf. as_ptr ( ) , out. as_mut_ptr ( ) . cast ( ) , buf. len ( ) ) ;
747
+ // Drop the Box<[u8]>, but not subfields
748
+ value. drop_nonrecursive ( ) ;
749
+ // We now have exclusive access to all subfields
750
+ out. assume_init ( )
749
751
} ) )
750
752
}
751
753
0 commit comments