This question already has answers here:
Call a constructor on a already allocated memory
(3个答案)
去年关闭。
我有一个分配为char *的内存池。当我想创建一个对象时,我从该池中请求内存,该内存在该池中某处返回的char *转换为void *。
所以当我创建一个对象时
但是,这不允许我访问Data类的构造函数,并且在创建值后必须对其进行赋值。
无论如何,有没有改变这一点,以使我可以像我一样传递参数
不知道是否可能。
以供参考:
https://en.cppreference.com/w/cpp/language/new
https://en.cppreference.com/w/cpp/memory/uninitialized_fill
如果可以使用C ++ 17功能,请同时查看
https://en.cppreference.com/w/cpp/memory/uninitialized_default_construct
https://en.cppreference.com/w/cpp/memory/uninitialized_value_construct
也许您应该考虑编写一个分配器来包装您的内存池:
https://en.cppreference.com/w/cpp/named_req/Allocator
(3个答案)
去年关闭。
我有一个分配为char *的内存池。当我想创建一个对象时,我从该池中请求内存,该内存在该池中某处返回的char *转换为void *。
所以当我创建一个对象时
Data* poolTest = (Data*)pool->GetMemory(sizeof(Data));
但是,这不允许我访问Data类的构造函数,并且在创建值后必须对其进行赋值。
无论如何,有没有改变这一点,以使我可以像我一样传递参数
Data* test = new Data(5, 5, 5);
不知道是否可能。
最佳答案
您似乎正在寻找新的展示位置。基本上,您给它原始内存,并在提供的内存区域中创建具有动态存储持续时间的对象。当然,管理内存区域和创建的对象的生命周期完全取决于您。
来自文档的示例:
char* ptr = new char[sizeof(T)]; // allocate memory
T* tptr = new(ptr) T; // construct in allocated storage ("place")
tptr->~T(); // destruct
delete[] ptr; // deallocate memory
以供参考:
https://en.cppreference.com/w/cpp/language/new
std::uninitialized_fill()
可能也适合您的用例:https://en.cppreference.com/w/cpp/memory/uninitialized_fill
如果可以使用C ++ 17功能,请同时查看
std::uninitialized_default_construct()
和std::uninitialized_value_construct()
:https://en.cppreference.com/w/cpp/memory/uninitialized_default_construct
https://en.cppreference.com/w/cpp/memory/uninitialized_value_construct
也许您应该考虑编写一个分配器来包装您的内存池:
https://en.cppreference.com/w/cpp/named_req/Allocator
10-06 10:21