我如何在这里使用新的位置?

时间:2012-04-12 09:45:29

标签: c++ memory-management new-operator

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

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

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

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

4 个答案:

答案 0 :(得分: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*的原因是使用void*的指针算法在C ++中是非法的。

答案 1 :(得分:0)

除非sizeof(Queue)== 512,否则它可能不是,除非你有一个非常专业的实现,那么你的方法将无法工作。您需要确保在malloc给出的内存片上分配实际节点。至于使用新的展示位置,不要隐瞒与内存对齐的潜在问题:

 char* mem = static_cast< char* >( malloc( 1024 ) );
 Queue* q1 = new ( mem ) Queue;
 Queue* q1 = new ( mem + 512 ) Queue;

答案 2 :(得分:0)

这对我来说很奇怪。我没有看到为什么这样做的原因。 你需要免费保存“mem”

当我想要同时使用两个队列时,我会这样做

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

...
DoubleQueue dq = new DoubleQueue;

Queue queue [] = new Queue [2];

答案 3 :(得分:0)

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

对我来说,这段代码意味着Queue类驻留在数据块之上,不知道它的任何内容(你没有Ctor参数,表明内存块大小)。也许给Queue对象一个指向内存块的指针和它的Ctor的块大小更方便?