Add valgrind pass to test script. Fix valgrind errors.
diff --git a/c++/src/kj/array.c++ b/c++/src/kj/array.c++
index 53f8ed6..36d7055 100644
--- a/c++/src/kj/array.c++
+++ b/c++/src/kj/array.c++
@@ -22,6 +22,7 @@
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "array.h"
+#include "exception.h"
namespace kj {
@@ -62,38 +63,43 @@
namespace _ { // private
+struct AutoDeleter {
+ void* ptr;
+ inline void* release() { void* result = ptr; ptr = nullptr; return result; }
+ inline AutoDeleter(void* ptr): ptr(ptr) {}
+ inline ~AutoDeleter() { operator delete(ptr); }
+};
+
void* HeapArrayDisposer::allocateImpl(size_t elementSize, size_t elementCount, size_t capacity,
void (*constructElement)(void*),
void (*destroyElement)(void*)) {
- void* result = operator new(elementSize * capacity);
+ AutoDeleter result(operator new(elementSize * capacity));
if (constructElement == nullptr) {
// Nothing to do.
} else if (destroyElement == nullptr) {
- byte* pos = reinterpret_cast<byte*>(result);
+ byte* pos = reinterpret_cast<byte*>(result.ptr);
while (elementCount > 0) {
constructElement(pos);
pos += elementSize;
--elementCount;
}
} else {
- ExceptionSafeArrayUtil guard(result, elementSize, 0, destroyElement);
+ ExceptionSafeArrayUtil guard(result.ptr, elementSize, 0, destroyElement);
guard.construct(elementCount, constructElement);
guard.release();
}
- return result;
+ return result.release();
}
void HeapArrayDisposer::disposeImpl(
void* firstElement, size_t elementSize, size_t elementCount, size_t capacity,
void (*destroyElement)(void*)) const {
// Note that capacity is ignored since operator delete() doesn't care about it.
+ AutoDeleter deleter(firstElement);
- if (destroyElement == nullptr) {
- operator delete(firstElement);
- } else {
- KJ_DEFER(operator delete(firstElement));
+ if (destroyElement != nullptr) {
ExceptionSafeArrayUtil guard(firstElement, elementSize, elementCount, destroyElement);
guard.destroyAll();
}