Как мы можем отменить выделение памяти, выделенной в статической функции-члене, используя std::memory_resource::allocate()
?
Я пытался использовать функцию удаления, передавая unique_ptr
вместо default_delete
.В этом случае он освобождает память распределителя.
Проблемы:
- Я не уверен в том, что время жизни объекта распределителя до конца
unique_ptr
выходит из области видимости - Я не хочу изменять подпись статической функции ниже формы, используя метод удаления.
например:
static std::unique_ptr<base,std::functional<void(base*)>> create(std::pmr::memory_resource* all)
{
void* ptr = all->allocate(sizeof(base));
std::unique_ptr<base, std::function<void(base*)> up(new base(), [&all]
(base* b){ all->deallocate(b,sizeof(base));
return std::move(up);
}
// Фактический исходный код
#define _CRTDBG_MAP_ALLOC
#include <iostream>
#include <memory_resource>
#include <memory>
#include <functional>
using namespace std;
class base
{
int val = 0;
public:
base()
{
}
~base()
{
cout << "dest" << endl;
}
static std::unique_ptr<base> create(std::pmr::memory_resource* all)
{
void* ptr = all->allocate(sizeof(base));
return std::unique_ptr<base>(new(ptr) base());
}
};
int main()
{
{
{
std::pmr::memory_resource* all = std::pmr::get_default_resource();
auto b1 = base::create(all);
auto b2 = base::create(all);
}
_CrtDumpMemoryLeaks();
}
return 0;
}
Я хочу освободить память, выделенную в статическом методе, без изменения сигнатуры функции (означает добавление функции удаления к unique_ptr
).
Предложите любое решение для решения этой проблемы, и, пожалуйста,также упомяните различные способы освобождения памяти, выделенной в этом примере кода, через allocate()
.