aboutsummaryrefslogtreecommitdiffstats
path: root/common/flexarray.h
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2023-12-15 21:38:20 -0800
committerChris Robinson <[email protected]>2023-12-15 21:38:20 -0800
commitf1c5b1a4345c48cb498570dca6a11c4947aa88bc (patch)
tree049eb60c062fdd28fe61db797cf42b6a79ee28d0 /common/flexarray.h
parent41266e96aeb0cac54d05a9e57dcea0990933dd33 (diff)
Catch a potential exception to free memory
Diffstat (limited to 'common/flexarray.h')
-rw-r--r--common/flexarray.h16
1 files changed, 13 insertions, 3 deletions
diff --git a/common/flexarray.h b/common/flexarray.h
index c317bfbe..ad15d554 100644
--- a/common/flexarray.h
+++ b/common/flexarray.h
@@ -2,6 +2,7 @@
#define AL_FLEXARRAY_H
#include <cstddef>
+#include <stdexcept>
#include <type_traits>
#include "almalloc.h"
@@ -69,11 +70,20 @@ struct FlexArray {
{ return Storage_t_::Sizeof(count, base); }
static std::unique_ptr<FlexArray> Create(index_type count)
{
- void *ptr{al_calloc(alignof(FlexArray), Sizeof(count))};
- return std::unique_ptr<FlexArray>{al::construct_at(static_cast<FlexArray*>(ptr), count)};
+ if(void *ptr{al_calloc(alignof(FlexArray), Sizeof(count))})
+ {
+ try {
+ return std::unique_ptr<FlexArray>{::new(ptr) FlexArray{count}};
+ }
+ catch(...) {
+ al_free(ptr);
+ throw;
+ }
+ }
+ throw std::bad_alloc();
}
- FlexArray(index_type size) : mStore{size} { }
+ FlexArray(index_type size) noexcept(noexcept(Storage_t_{size})) : mStore{size} { }
~FlexArray() = default;
[[nodiscard]] auto size() const noexcept -> index_type { return mStore.mData.size(); }