Как освободить память, выделенную с помощью std :: memory_resource в статическом методе, без изменения подписи функции ниже - PullRequest
0 голосов
/ 20 апреля 2019

Как мы можем отменить выделение памяти, выделенной в статической функции-члене, используя 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().

1 Ответ

0 голосов
/ 20 апреля 2019

Память, выделенная с помощью std::pmr::memory_resource::allocate, должна быть освобождена с использованием std::pmr::memory_resource::deallocate.

. Выполнение следующих действий неправильно:

void* ptr = all->allocate(sizeof(base));
return std::unique_ptr<base>(new(ptr) base());

Проблема здесь в том, что unique_ptr вызовет delete на указателе, удерживаемом ptr, и это недопустимо.В связи с этим вы должны предоставить пользовательское средство удаления, и нет никакого способа обойти это.

Поскольку не ясно, какую проблему вы хотите решить с помощью memory_resource::allocate, на самом деле невозможно сказать, как вы могли быреши это.Выделение памяти на объект кажется, по крайней мере, очень странным и указывает на неправильность вашего подхода.

...