我试图在内存中逐个分配第一个顺序的指针。 第二个顺序的指针必须遍历此队列并处理在该指针上创建的对象。 当我分配对象队列(而不是指向它们的指针)时,Placement new工作正常,但是当我用指针尝试相同时,麻烦就会发生。
int* p;
p = new int(1);
printf("%p - %d\n", p, *p); // address of int and its value
delete p;
创建并删除第一个对象以使用某个地址初始化指针,下一个对象将在循环中创建
p = new(p) int(2); // (p) - memory will be allocated at address
// on which p points
printf("%p - %d\n", p, *p); // address of int and its value
delete p;
p++;
p = new(p) int(3); // (p) - memory will be allocated at address
// on which p points
printf("%p - %d\n", p, *p); // address of int and its value
delete p;
输出:
01C1FFD0 - 1
01C1FFD0 - 2
01C1FFD4 - 3;
int** pp;
pp = new int*;
printf("%p\n", pp); // address of int*
*pp = new int(1);
printf("%p - %d\n", *pp, **pp); // address of int and its value
delete *pp;
delete pp;
pp = new(pp) int*;
printf("%p\n", pp); // address of int*
*pp = new int(2);
printf("%p - %d\n", *pp, **pp); // address of int and its value
delete *pp;
delete pp;
pp++;
pp = new(pp) int*;
printf("%p\n", pp); // address of int*
*pp = new int(3);
printf("%p - %d\n", *pp, **pp); // address of int and its value
delete *pp;
delete pp;
如果int不是由* pp创建的,那么如果pp递增,则以后删除pp是不正确的, 如果int是由* pp创建的,那么地址和第二个值就会有一些奇怪的东西。
输出:
01C1FFD0
01C1FFE0 - 1
01C1FFD0
01C1FFD0 - 29491152
01C1FFD4
01C1FFD0 - 3
我非常感谢有关如何正确组织此队列的建议。
答案 0 :(得分:1)
p = new(p) int(2); // (p) - memory will be allocated at address // on which p points
这是你第一次出错的地方。 new(p) T
不分配任何内存。而不是那样,它只是在地址T
处创建p
,假设p
指向可以构造T
的某个内存。此外,由于没有分配内存,您不能只将这些指针传递给delete
,因为这将尝试释放未分配的存储。而不是那样,你需要手动调用析构函数并处理内存,具体取决于你获得它。
展示位置new
是一个相当先进的概念,您此时很可能不需要。实际上,即使是“简单”的手动内存/对象生命周期管理也是您在学习的这个时候可能不应该烦恼的事情。你从哪本书学习C ++?你看过this book list了吗?
仅供参考:我没有看过你的代码。