gpt4 book ai didi

c++ - 指针 block 的新位置

转载 作者:太空宇宙 更新时间:2023-11-04 12:03:12 24 4
gpt4 key购买 nike

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

如果能提供有关如何正确组织此队列的建议,我将不胜感激。

最佳答案

p = new(p) int(2);    // (p) - memory will be allocated at address
// on which p points

这是你第一次错的地方。 new(p) T 不分配任何内存。而不是那样,它只是在地址 p 处创建一个 T,假设 p 指向某个内存,其中 T 可以构建。此外,由于没有分配内存,您不能只将此类指针传递给 delete,因为这将尝试释放未分配的存储空间。而不是那样,您需要手动调用析构函数并根据获取内存的方式处理内存。

Placement new 是一个相当高级的概念,此时您很可能不需要。事实上,即使是“简单的”手动内存/对象生命周期管理也是您在学习期间可能不应该为之烦恼的事情。你是从什么书学C++的?你见过this book list吗?

仅供引用:我没有查看该行下方的代码。

关于c++ - 指针 block 的新位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13310091/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com