使用新的指针

Using new for an already valid pointer

本文关键字:指针      更新时间:2023-10-16

如果我已经使用了new将内存分配给int* p,但是如果我想再次使用new,那么先前分配的内存会保持有效吗?

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

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

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

当您分配内存时,您要求系统分配内存,并告诉您内存的地址,系统,系统分配。您有责任记住该地址,以便将来可以参考它。您需要能够参考内存才能访问并最终对其进行处理。

这是您的代码:

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

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

因此,您遇到的问题是您不再具有包含第一个内存块地址的变量。尽管第一个块仍然有效,但您无法参考它。特别是,由于您无法再参考它,因此您无法对其进行处理,因此它将被泄漏。

如果您希望能够对两个内存块进行处理,则必须能够参考两个块。这意味着您必须有两个变量才能容纳两个不同的地址。

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

现在您可以分别参考块块。完成后,请分配内存:

delete[] p1;
delete[] p2;

另一方面,如果要在分配新块之前删除内存,则可以做到这一点:

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

上一个预言保留在堆上的某个地方。您可以使用Valgrind来验证这一点。如果您想一次又一次使用理智的指针,则可以考虑创建一个删除最后分配和每次将新空间的函数...

添加大卫·赫弗南(David Heffernan)所说的话,当您有此陈述时:

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

不要将p视为分配的内存。内存独立于p,但是您将p用作一种邮政注释来记下该内存所在的位置。当您为p分配新值时,您只是覆盖笔记。您还没有对分配的记忆做任何事情 - 您只是不知道它在哪里。

如果不再需要您先前分配的内存,则必须使用delete []来释放内存。否则,内存仍在那里,但是您无法再访问它,因此内存泄漏

您需要delete[] p;,以避免内存泄漏。内存不会单独发布。编译器根据"无法删除它"提供的确切信息是什么?