为指针块放置新的

时间:2012-11-09 14:39:42

标签: c++

我试图在内存中逐个分配第一个顺序的指针。 第二个顺序的指针必须遍历此队列并处理在该指针上创建的对象。 当我分配对象队列(而不是指向它们的指针)时,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

我非常感谢有关如何正确组织此队列的建议。

1 个答案:

答案 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了吗?

仅供参考:我没有看过你的代码。