我有一个内存区域,将用于多个队列。例如,我分配了 1024 字节的内存,我需要两个队列。第一个队列将占用前 512 个字节,第二个队列将占用接下来的 512 个字节。
但是,我的队列由 C++ 类表示。使用placement new 运算符,我如何构造每个队列对象。以下方法是否正确?
Queue *q1, *q2;
void *mem = malloc( 1024 );
*q1 = new (mem) Queue;
*q2 = new (mem+512)Queue;
我有一个内存区域,将用于多个队列。例如,我分配了 1024 字节的内存,我需要两个队列。第一个队列将占用前 512 个字节,第二个队列将占用接下来的 512 个字节。
但是,我的队列由 C++ 类表示。使用placement new 运算符,我如何构造每个队列对象。以下方法是否正确?
Queue *q1, *q2;
void *mem = malloc( 1024 );
*q1 = new (mem) Queue;
*q2 = new (mem+512)Queue;
我会做以下事情:
Queue* mem = static_cast<Queue*>(malloc(2 * sizeof(Queue));
Queue* q1 = new (mem) Queue;
Queue* q2 = new (mem+1) Queue;
如果两个队列彼此恰好相距 512 个字节很重要,那么您的原始建议几乎是正确的:
char* mem = static_cast<char*>(malloc(1024));
Queue* q1 = new (mem) Queue;
Queue* q2 = new (mem+512) Queue;
这假设sizeof(Queue) <= 512
. 强制转换为的原因char*
是指针算术 withvoid*
在 C++ 中是非法的。
除非 sizeof(Queue) == 512,除非你有一个非常专业的实现,否则它可能不是,那么你的方法是行不通的。您需要确保将实际节点分配在 malloc 给定的内存片上。至于使用placement new,而不是隐瞒内存对齐的潜在问题:
char* mem = static_cast< char* >( malloc( 1024 ) );
Queue* q1 = new ( mem ) Queue;
Queue* q1 = new ( mem + 512 ) Queue;
这对我来说看起来很奇怪。我看不出这样做的理由。您需要免费保存“mem”
当我一次想要两个队列时,我会这样做
class DoubleQueue {
public Queue q1;
public Queue q2;
}
...
DoubleQueue dq = new DoubleQueue;
或者
Queue queue [] = new Queue [2];
看来,您在两个分配运算符的 lhs 上都有未初始化指针的指针取消引用,因此,您尝试将地址分配给值。
对我来说,这段代码意味着 Queue 类位于数据块的顶部,对它一无所知(您没有 Ctor 参数,表示内存块大小)。也许给 Queue 对象一个指向内存块的指针和一个指向它的 Ctor 的块大小更方便?