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