C++ 指针块的新位置

C++ 指针块的新位置,c++,C++,我试图在内存中一个接一个地分配一阶指针。 第二级指针必须遍历此队列并处理在该指针上创建的对象。 当我分配对象队列(不是指向它们的指针)时,Placement new可以正常工作,但当我尝试使用相同的指针时,问题就发生了 int* p; p = new int(1); printf("%p - %d\n", p, *p); // address of int and its value delete p; 第一个对象被创建和删除以初始化带有某个地址的指针,下一个对象将在循环中创建 p =

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

01C10-1

01C1FFD0

01C1FFD0-29491152

01C1FFD4

01C1FFD0-3

如果您能给我建议如何正确组织这个队列,我将不胜感激

这是你第一次错的地方
new(p)T
不分配任何内存。相反,它只是在地址
p
处创建一个
T
,假设
p
指向某个可以构造
T
的内存。另外,由于没有分配内存,您不能只将这些指针传递到
delete
,因为这将试图释放未分配的存储。相反,您需要手动调用析构函数,并根据获取内存的方式处置内存

Placement
new
是一个相当高级的概念,此时您可能不需要它。事实上,即使是“简单”的手动内存/对象生命周期管理,在您学习的这个时候也不应该让您感到困扰。你从C++学习到什么书?你看到了吗

仅供参考:我还没有看过你那行下面的代码

这是你第一次错的地方
new(p)T
不分配任何内存。相反,它只是在地址
p
处创建一个
T
,假设
p
指向某个可以构造
T
的内存。另外,由于没有分配内存,您不能只将这些指针传递到
delete
,因为这将试图释放未分配的存储。相反,您需要手动调用析构函数,并根据获取内存的方式处置内存

Placement
new
是一个相当高级的概念,此时您可能不需要它。事实上,即使是“简单”的手动内存/对象生命周期管理,在您学习的这个时候也不应该让您感到困扰。你从C++学习到什么书?你看到了吗


仅供参考:我还没有看过你那行下面的代码

Placement
new
不分配内存!它实际上是高度误导性的,因为它几乎与传统的
new
完全无关–默认情况下,它只调用对象的构造函数。。。你只是想做一个链表?!在
删除p之后添加康拉德所说的内容
p
不再指向可用存储,因此您无法在它指向的位置构造新的
int
对象。这种(错误地)使用placement new(放置新)的方式使整个事物具有未定义的行为。placement
new
不分配内存!它实际上是高度误导性的,因为它几乎与传统的
new
完全无关–默认情况下,它只调用对象的构造函数。。。你只是想做一个链表?!在
删除p之后添加康拉德所说的内容
p
不再指向可用存储,因此您无法在它指向的位置构造新的
int
对象。这种(错误地)使用新的布局使整个事物具有未定义的行为。
p = new(p) int(2);    // (p) - memory will be allocated at address
                      // on which p points