如何在静态方法中取消分配使用std :: memory_resource分配的内存而不更改下面的函数签名

问题描述 投票:0回答:1

我们如何使用std::memory_resource::allocate()取消分配静态成员函数中分配的内存?

我尝试使用删除函数传递给unique_ptr而不是default_delete。在这种情况下,它释放了分配器内存。

问题是:

  • 我不确定分配器对象的生命周期,直到unique_ptr超出范围
  • 我不想使用deleter方法更改表单下面的静态函数签名。

例如:

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()释放此示例代码中分配的内存的不同方法。

c++ c++11 c++14
1个回答
0
投票

分配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解决什么问题,因此无法确定如何解决它。每个对象的内存分配似乎很奇怪,至少,并表明你的方法是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.