gpt4 book ai didi

c++ - 对已经有效的指针使用 new

转载 作者:行者123 更新时间:2023-11-30 01:54:50 25 4
gpt4 key购买 nike

如果我已经使用 new 将内存分配给 int* p,但是如果我想再次使用 new,先前分配的内存仍然有效?

int *p;
p= new int[5]; //is this going to remain valid after the following statement?
p= new int[10];

如果是,那么我需要删除[]吗?我试过这样做,但编译器说指针是有效的,所以我不能删除它。有没有其他方法可以摆脱以前分配的内存?

最佳答案

new[] 的第二次使用本身完全独立于第一次。第二次使用 new[] 不会以任何方式使您分配的第一个内存块无效。

当你分配内存时,你是在要求系统分配内存,并告诉你系统分配的内存地址。您有责任记住该地址,以便日后引用。您需要能够引用内存才能访问它并最终释放它。

这是您的代码:

int *p;
p= new int[5];
p= new int[10];

第一个赋值记录了第一个分配 block 的地址。第二个赋值用第二个 block 的地址覆盖该值。

因此,您遇到的问题是您不再拥有包含第一个内存块地址的变量。虽然第一个 block 仍然有效,但您无法引用它。特别是,因为你不能再引用它,你不能释放它,所以它会被泄露。

如果您希望能够释放这两个内存块,那么您必须能够引用这两个 block 。这意味着您必须有两个变量来保存两个不同的地址。

int* p1 = new int[5]; 
int* p2 = new int[10];

现在可以单独引用blocks block 了。完成后,释放内存:

delete[] p1;
delete[] p2;

另一方面,如果你想在分配新 block 之前删除内存,你可以这样做:

int* p = new int[5]; 
// use p
detete[] p;

int* p = new int[10];
// use p
delete[] p;

关于c++ - 对已经有效的指针使用 new,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21495498/

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