如何在静态方法中取消分配使用std :: memory_resource分配的内存而不更改下面的函数签名
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在静态方法中取消分配使用std :: memory_resource分配的内存而不更改下面的函数签名相关的知识,希望对你有一定的参考价值。
我们如何使用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()
释放此示例代码中分配的内存的不同方法。
答案
分配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
解决什么问题,因此无法确定如何解决它。每个对象的内存分配似乎很奇怪,至少,并表明你的方法是错误的。
以上是关于如何在静态方法中取消分配使用std :: memory_resource分配的内存而不更改下面的函数签名的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2022 C# 编辑器中取消加粗静态方法?