C++ 指针块的新位置
我试图在内存中一个接一个地分配一阶指针。 第二级指针必须遍历此队列并处理在该指针上创建的对象。 当我分配对象队列(不是指向它们的指针)时,Placement new可以正常工作,但当我尝试使用相同的指针时,问题就发生了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 =
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
,因为这将试图释放未分配的存储。相反,您需要手动调用析构函数,并根据获取内存的方式处置内存
Placementnew
是一个相当高级的概念,此时您可能不需要它。事实上,即使是“简单”的手动内存/对象生命周期管理,在您学习的这个时候也不应该让您感到困扰。你从C++学习到什么书?你看到了吗
仅供参考:我还没有看过你那行下面的代码
这是你第一次错的地方new(p)T
不分配任何内存。相反,它只是在地址p
处创建一个T
,假设p
指向某个可以构造T
的内存。另外,由于没有分配内存,您不能只将这些指针传递到delete
,因为这将试图释放未分配的存储。相反,您需要手动调用析构函数,并根据获取内存的方式处置内存
Placementnew
是一个相当高级的概念,此时您可能不需要它。事实上,即使是“简单”的手动内存/对象生命周期管理,在您学习的这个时候也不应该让您感到困扰。你从C++学习到什么书?你看到了吗
仅供参考:我还没有看过你那行下面的代码 Placement
new
不分配内存!它实际上是高度误导性的,因为它几乎与传统的new
完全无关–默认情况下,它只调用对象的构造函数。。。你只是想做一个链表?!在删除p之后添加康拉德所说的内容
,p
不再指向可用存储,因此您无法在它指向的位置构造新的int
对象。这种(错误地)使用placement new(放置新)的方式使整个事物具有未定义的行为。placementnew
不分配内存!它实际上是高度误导性的,因为它几乎与传统的new
完全无关–默认情况下,它只调用对象的构造函数。。。你只是想做一个链表?!在删除p之后添加康拉德所说的内容
,p
不再指向可用存储,因此您无法在它指向的位置构造新的int
对象。这种(错误地)使用新的布局使整个事物具有未定义的行为。
p = new(p) int(2); // (p) - memory will be allocated at address
// on which p points