我有一段处理 C++ 数组的代码。
using namespace std;
#include <iostream>
int main(){
int *p;
p = new int[3];
for(int i = 0; i < 3; i++){
p[i] = i;
}
//delete[] p;
for(int i = 0;i <3; i++){
std::cout << *(p+i) << std::endl;
}
}
这段代码是如何工作的?内存位置 *(p+i) 是如何工作的?它与使用 p[i] 有什么不同。如果我们取消注释行delete[] p.
,代码会有什么不同最佳答案
1)当你这样做时:
p = new int[3];
现在,p
指向动态分配数组的第一个元素。
当你这样做时,*(p + i)
将导致简单的指针算术。它将归结为:value of (<address pointed by p> + <size of type pointed by p> * i
) 相当于 p[i]
.
这就是它起作用的原因。
2) 在 C++ 中,与 java 不同,您必须使用 delete
显式清除动态分配的内存。 ,因为 C++ 中没有 GC(根据 Bjarne Stroustrup 的说法,永远不会有)。否则,该内存区域将在应用程序生命周期内保持获取状态,从而导致内存泄漏。
建议:
放置您的 delete
在程序的最后。否则,下面的循环可能会给出 SIGSEGV。
此外,避免使用 new
和delete
尽可能多。
关于C++ 数组和内存位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54299563/