mirror of https://github.com/microsoft/mimalloc
Fix std::shared_pointer calling free on provided heap pointers
This commit is contained in:
parent
068dc014ec
commit
3d89f6388e
|
@ -495,7 +495,7 @@ template<class T, bool _mi_destroy> struct _mi_heap_stl_allocator_common : publi
|
|||
using typename _mi_stl_allocator_common<T>::value_type;
|
||||
using typename _mi_stl_allocator_common<T>::pointer;
|
||||
|
||||
_mi_heap_stl_allocator_common(mi_heap_t* hp) : heap(hp) { } /* will not delete nor destroy the passed in heap */
|
||||
_mi_heap_stl_allocator_common(mi_heap_t* hp) : heap(hp, [](mi_heap_t*) {}) {} /* will not delete nor destroy the passed in heap */
|
||||
|
||||
#if (__cplusplus >= 201703L) // C++17
|
||||
mi_decl_nodiscard T* allocate(size_type count) { return static_cast<T*>(mi_heap_alloc_new_n(this->heap.get(), count, sizeof(T))); }
|
||||
|
|
|
@ -46,6 +46,11 @@ bool test_heap2(void);
|
|||
bool test_stl_allocator1(void);
|
||||
bool test_stl_allocator2(void);
|
||||
|
||||
bool test_stl_heap_allocator1(void);
|
||||
bool test_stl_heap_allocator2(void);
|
||||
bool test_stl_heap_allocator3(void);
|
||||
bool test_stl_heap_allocator4(void);
|
||||
|
||||
bool mem_is_zero(uint8_t* p, size_t size) {
|
||||
if (p==NULL) return false;
|
||||
for (size_t i = 0; i < size; ++i) {
|
||||
|
@ -304,6 +309,11 @@ int main(void) {
|
|||
CHECK("stl_allocator1", test_stl_allocator1());
|
||||
CHECK("stl_allocator2", test_stl_allocator2());
|
||||
|
||||
CHECK("stl_heap_allocator1", test_stl_heap_allocator1());
|
||||
CHECK("stl_heap_allocator2", test_stl_heap_allocator2());
|
||||
CHECK("stl_heap_allocator3", test_stl_heap_allocator3());
|
||||
CHECK("stl_heap_allocator4", test_stl_heap_allocator4());
|
||||
|
||||
// ---------------------------------------------------
|
||||
// Done
|
||||
// ---------------------------------------------------[]
|
||||
|
@ -357,3 +367,61 @@ bool test_stl_allocator2(void) {
|
|||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool test_stl_heap_allocator1(void) {
|
||||
#ifdef __cplusplus
|
||||
std::vector<some_struct, mi_heap_stl_allocator<some_struct> > vec;
|
||||
vec.push_back(some_struct());
|
||||
vec.pop_back();
|
||||
return vec.size() == 0;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool test_stl_heap_allocator2(void) {
|
||||
#ifdef __cplusplus
|
||||
std::vector<some_struct, mi_heap_destroy_stl_allocator<some_struct> > vec;
|
||||
vec.push_back(some_struct());
|
||||
vec.pop_back();
|
||||
return vec.size() == 0;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool test_stl_heap_allocator3(void) {
|
||||
#ifdef __cplusplus
|
||||
mi_heap_t* heap = mi_heap_new();
|
||||
bool good = false;
|
||||
{
|
||||
mi_heap_stl_allocator<some_struct> myAlloc(heap);
|
||||
std::vector<some_struct, mi_heap_stl_allocator<some_struct> > vec(myAlloc);
|
||||
vec.push_back(some_struct());
|
||||
vec.pop_back();
|
||||
good = vec.size() == 0;
|
||||
}
|
||||
mi_heap_delete(heap);
|
||||
return good;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool test_stl_heap_allocator4(void) {
|
||||
#ifdef __cplusplus
|
||||
mi_heap_t* heap = mi_heap_new();
|
||||
bool good = false;
|
||||
{
|
||||
mi_heap_destroy_stl_allocator<some_struct> myAlloc(heap);
|
||||
std::vector<some_struct, mi_heap_destroy_stl_allocator<some_struct> > vec(myAlloc);
|
||||
vec.push_back(some_struct());
|
||||
vec.pop_back();
|
||||
good = vec.size() == 0;
|
||||
}
|
||||
mi_heap_destroy(heap);
|
||||
return good;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue