4

我有一个内存区域,将用于多个队列。例如,我分配了 1024 字节的内存,我需要两个队列。第一个队列将占用前 512 个字节,第二个队列将占用接下来的 512 个字节。

但是,我的队列由 C++ 类表示。使用placement new 运算符,我如何构造每个队列对象。以下方法是否正确?

Queue *q1, *q2;
void *mem = malloc( 1024 );

*q1 = new (mem) Queue;
*q2 = new (mem+512)Queue;
4

4 回答 4

7

我会做以下事情:

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++ 中是非法的。

于 2012-04-12T09:48:30.993 回答
0

除非 sizeof(Queue) == 512,除非你有一个非常专业的实现,否则它可能不是,那么你的方法是行不通的。您需要确保将实际节点分配在 malloc 给定的内存片上。至于使用placement new,而不是隐瞒内存对齐的潜在问题:

 char* mem = static_cast< char* >( malloc( 1024 ) );
 Queue* q1 = new ( mem ) Queue;
 Queue* q1 = new ( mem + 512 ) Queue;
于 2012-04-12T09:53:33.473 回答
0

这对我来说看起来很奇怪。我看不出这样做的理由。您需要免费保存“mem”

当我一次想要两个队列时,我会这样做

class DoubleQueue {
   public Queue q1;
   public Queue q2;
}

...
DoubleQueue dq = new DoubleQueue;

或者

Queue queue [] = new Queue [2];
于 2012-04-12T09:56:38.213 回答
0

看来,您在两个分配运算符的 lhs 上都有未初始化指针的指针取消引用,因此,您尝试将地址分配给值。

对我来说,这段代码意味着 Queue 类位于数据块的顶部,对它一无所知(您没有 Ctor 参数,表示内存块大小)。也许给 Queue 对象一个指向内存块的指针和一个指向它的 Ctor 的块大小更方便?

于 2012-04-12T10:03:59.647 回答