@@ -129,7 +129,12 @@ class SparseSet {
129129 using DenseT = SmallVector<ValueT, 8 >;
130130 using size_type = unsigned ;
131131 DenseT Dense;
132- SparseT *Sparse = nullptr ;
132+
133+ struct Deleter {
134+ void operator ()(SparseT *S) { free (S); }
135+ };
136+ std::unique_ptr<SparseT[], Deleter> Sparse;
137+
133138 unsigned Universe = 0 ;
134139 KeyFunctorT KeyIndexOf;
135140 SparseSetValFunctor<KeyT, ValueT, KeyFunctorT> ValIndexOf;
@@ -144,7 +149,7 @@ class SparseSet {
144149 SparseSet () = default ;
145150 SparseSet (const SparseSet &) = delete ;
146151 SparseSet &operator =(const SparseSet &) = delete ;
147- ~ SparseSet () { free (Sparse); }
152+ SparseSet (SparseSet &&) = default ;
148153
149154 // / setUniverse - Set the universe size which determines the largest key the
150155 // / set can hold. The universe must be sized before any elements can be
@@ -159,11 +164,10 @@ class SparseSet {
159164 // Hysteresis prevents needless reallocations.
160165 if (U >= Universe/4 && U <= Universe)
161166 return ;
162- free (Sparse);
163167 // The Sparse array doesn't actually need to be initialized, so malloc
164168 // would be enough here, but that will cause tools like valgrind to
165169 // complain about branching on uninitialized data.
166- Sparse = static_cast <SparseT*>(safe_calloc (U, sizeof (SparseT)));
170+ Sparse. reset ( static_cast <SparseT *>(safe_calloc (U, sizeof (SparseT) )));
167171 Universe = U;
168172 }
169173
0 commit comments