@@ -72,28 +72,34 @@ OpInfo OpInfoImpl::Create(Dialect *dialect,
72
72
<< " interfaces, " << traits_num << " traits, " << attributes_num
73
73
<< " attributes." ;
74
74
size_t base_size = sizeof (TypeId) * traits_num + sizeof (OpInfoImpl);
75
- char *base_ptr = static_cast <char *>(:: operator new ( base_size) );
75
+ std::unique_ptr <char []> base_ptr ( new char [ base_size] );
76
76
VLOG (10 ) << " Malloc " << base_size << " Bytes at "
77
- << static_cast <void *>(base_ptr);
77
+ << static_cast <void *>(base_ptr.get ());
78
+
79
+ char *raw_base_ptr = base_ptr.get ();
78
80
if (traits_num > 0 ) {
79
- auto p_first_trait = reinterpret_cast <TypeId *>(base_ptr );
80
- memcpy (base_ptr , trait_set.data (), sizeof (TypeId) * traits_num);
81
+ auto p_first_trait = reinterpret_cast <TypeId *>(raw_base_ptr );
82
+ memcpy (raw_base_ptr , trait_set.data (), sizeof (TypeId) * traits_num);
81
83
std::sort (p_first_trait, p_first_trait + traits_num);
82
- base_ptr += traits_num * sizeof (TypeId);
84
+ raw_base_ptr += traits_num * sizeof (TypeId);
83
85
}
86
+
84
87
// Construct OpInfoImpl.
85
- VLOG (10 ) << " Construct OpInfoImpl at " << reinterpret_cast <void *>(base_ptr)
86
- << " ......" ;
87
- OpInfo op_info = OpInfo (new (base_ptr) OpInfoImpl (std::move (interface_set),
88
- dialect,
89
- op_id,
90
- op_name,
91
- traits_num,
92
- attributes_num,
93
- attributes_name,
94
- verify_sig,
95
- verify_region));
96
- return op_info;
88
+ VLOG (10 ) << " Construct OpInfoImpl at "
89
+ << reinterpret_cast <void *>(raw_base_ptr) << " ......" ;
90
+ OpInfoImpl *impl = new (raw_base_ptr) OpInfoImpl (std::move (interface_set),
91
+ dialect,
92
+ op_id,
93
+ op_name,
94
+ traits_num,
95
+ attributes_num,
96
+ attributes_name,
97
+ verify_sig,
98
+ verify_region);
99
+
100
+ // Release the unique_ptr ownership after successful construction
101
+ base_ptr.release ();
102
+ return OpInfo (impl);
97
103
}
98
104
void OpInfoImpl::Destroy (OpInfo info) {
99
105
if (info.impl_ ) {
0 commit comments