我有一个内存区域,它将用于多个队列。例如,我分配1024字节的内存,我需要两个队列。第一个队列占用前512个字节,第二个队列占用下一个512字节。
但是,我的队列由C ++类表示。使用placement new运算符,我如何构造每个队列对象。以下方法是否正确?
Queue *q1, *q2;
void *mem = malloc( 1024 );
*q1 = new (mem) Queue;
*q2 = new (mem+512)Queue;
答案 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的块大小更方便?