aboutsummaryrefslogtreecommitdiff
path: root/src/prevector.h
diff options
context:
space:
mode:
authorKaz Wesley <keziahw@gmail.com>2016-04-13 10:09:16 -0700
committerKaz Wesley <keziahw@gmail.com>2016-04-16 08:05:11 -0700
commit1e2c29f2632c378843c5a3c9ad401a7bcacc4de0 (patch)
tree7593134b5e9742d04fd7d2b6f8b3dd16cd563754 /src/prevector.h
parent73fc922ed64333d45f18d8a448f30cfa2ae0281e (diff)
prevector: destroy elements only via erase()
Fixes a bug in which pop_back did not call the deleted item's destructor. Using the most general erase() implementation to implement all the others prevents similar bugs because the coupling between deallocation and destructor invocation only needs to be maintained in one place. Also reduces duplication of complex memmove logic.
Diffstat (limited to 'src/prevector.h')
-rw-r--r--src/prevector.h12
1 files changed, 4 insertions, 8 deletions
diff --git a/src/prevector.h b/src/prevector.h
index 1da459bcfe..16b2f8dca7 100644
--- a/src/prevector.h
+++ b/src/prevector.h
@@ -298,9 +298,8 @@ public:
}
void resize(size_type new_size) {
- while (size() > new_size) {
- item_ptr(size() - 1)->~T();
- _size--;
+ if (size() > new_size) {
+ erase(item_ptr(new_size), end());
}
if (new_size > capacity()) {
change_capacity(new_size);
@@ -368,10 +367,7 @@ public:
}
iterator erase(iterator pos) {
- (*pos).~T();
- memmove(&(*pos), &(*pos) + 1, ((char*)&(*end())) - ((char*)(1 + &(*pos))));
- _size--;
- return pos;
+ return erase(pos, pos + 1);
}
iterator erase(iterator first, iterator last) {
@@ -396,7 +392,7 @@ public:
}
void pop_back() {
- _size--;
+ erase(end() - 1, end());
}
T& front() {