使用新的指针
Using new for an already valid pointer
如果我已经使用了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;
,以避免内存泄漏。内存不会单独发布。编译器根据"无法删除它"提供的确切信息是什么?
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错