我有一段处理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。
行,代码有什么区别?答案 0 :(得分:4)
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
。