从空指针初始化 class/struct
Initializing class/struct from a void pointer
我有一个分配为 char* 的内存池。当我想创建一个对象时,我从那个池中请求内存 returns 该池中某处的一个 char* 转换为 void*.
所以当我创建一个对象时,我会这样做
Data* poolTest = (Data*)pool->GetMemory(sizeof(Data));
但这不允许我访问 class 数据的构造函数,我必须在创建它后分配值。
有没有什么办法可以改变这个,让我像对待
一样传递参数
Data* test = new Data(5, 5, 5);
不确定是否可行。
您要找的似乎是 placement new。基本上你给它原始内存,并在提供的内存区域中创建具有动态存储持续时间的对象。当然,管理内存区域和创建的对象的生命周期取决于您。
来自文档的示例:
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
供参考:
可能 std::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
也许你应该考虑写一个分配器来包装你的内存池:
我有一个分配为 char* 的内存池。当我想创建一个对象时,我从那个池中请求内存 returns 该池中某处的一个 char* 转换为 void*.
所以当我创建一个对象时,我会这样做
Data* poolTest = (Data*)pool->GetMemory(sizeof(Data));
但这不允许我访问 class 数据的构造函数,我必须在创建它后分配值。
有没有什么办法可以改变这个,让我像对待
一样传递参数Data* test = new Data(5, 5, 5);
不确定是否可行。
您要找的似乎是 placement new。基本上你给它原始内存,并在提供的内存区域中创建具有动态存储持续时间的对象。当然,管理内存区域和创建的对象的生命周期取决于您。
来自文档的示例:
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
供参考:
可能 std::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
也许你应该考虑写一个分配器来包装你的内存池: