【发布时间】:2013-09-29 18:17:24
【问题描述】:
我开始实现一个基于 ID 的内存池,其中每个元素都有一个 id,它基本上是向量中的一个索引。在这种特殊情况下,我在构造对象本身之前就知道索引,所以我认为我在调用构造函数之前设置了 ID。
一些细节
从基于 ID 的池中分配对象如下:
- 从池中分配一个空闲 id
- 根据id值获取内存地址
- 在内存地址上构造对象
- 设置对象的ID成员
并且释放是基于该 id
这是代码(感谢 jrok):
#include <new>
#include <iostream>
struct X
{
X()
{
// id come from "nothing"
std::cout << "X constructed with id: " << id << std::endl;
}
int id;
};
int main()
{
void* buf = operator new(sizeof(X));
// can I set the ID before the constructor call
((X*)buf)->id = 42;
new (buf) X;
std::cout << ((X*)buf)->id;
}
编辑
我在 boost 沙盒中找到了一个解决方案: sandbox Boost.Tokenmap
【问题讨论】:
-
代码很多;您能指出与您的问题相关的部分吗?
-
我在代码中放了两条注释,也许我应该以某种方式标记它
-
我建议你删除所有与问题不直接相关的代码,并构造一个 minimal test-case 来演示你在说什么;)
-
如果你问你是否可以做this,那么答案是否定的(即使它有效:))。
-
@Industrial-antidepressant:新代码使您的问题更加清晰 100 倍。谢谢!
标签: c++ memory-management c++11