@@ -129,7 +129,12 @@ class SparseSet {
129
129
using DenseT = SmallVector<ValueT, 8 >;
130
130
using size_type = unsigned ;
131
131
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
+
133
138
unsigned Universe = 0 ;
134
139
KeyFunctorT KeyIndexOf;
135
140
SparseSetValFunctor<KeyT, ValueT, KeyFunctorT> ValIndexOf;
@@ -144,7 +149,7 @@ class SparseSet {
144
149
SparseSet () = default ;
145
150
SparseSet (const SparseSet &) = delete ;
146
151
SparseSet &operator =(const SparseSet &) = delete ;
147
- ~ SparseSet () { free (Sparse); }
152
+ SparseSet (SparseSet &&) = default ;
148
153
149
154
// / setUniverse - Set the universe size which determines the largest key the
150
155
// / set can hold. The universe must be sized before any elements can be
@@ -159,11 +164,10 @@ class SparseSet {
159
164
// Hysteresis prevents needless reallocations.
160
165
if (U >= Universe/4 && U <= Universe)
161
166
return ;
162
- free (Sparse);
163
167
// The Sparse array doesn't actually need to be initialized, so malloc
164
168
// would be enough here, but that will cause tools like valgrind to
165
169
// 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) )));
167
171
Universe = U;
168
172
}
169
173
0 commit comments