C++内存分配有两种:静态分配和动态分配。
举个简单的例子如下
int a=1024;
对象a的内存空间就是静态分配的,是在编译器对程序进行编译时分配的,当然对它空间的回收也是编译器自动完成的,开发者只需要知道这个事实就好,不需要我们显示的回收。

int *p=new int(1024);
先来说下这句程序的意思:现在分配一个新的空间给一个没有名字的Int型对象,并且为这个空间赋予初始化数值为1024。由于该Int型对象没有名字,所以如果需要访问它的话,就需要使用指针来指向该对象所在的内存地址。注意,new int(1024)这个表达式返回的是该没有名字的对象的内存地址。

int *p=new int[1024];
这个和上面的就有点不一样了。可以看的出,这个是动态分配数组,这个P叫数组指针。意思是什么呢:现在分配新的空间给数组里面的1024个元素,但是这1024个元素我们没有办法显式的为它们分配初始化数值。并且这个指针只指向这个数组第一个元素的地址。如果想要访问其他数组元素,可以用*p++来实现。

既然上面两个new 都是动态分配的,那么自然需要手动删除所分配的空间了。
第一个是 delete p;
第二个是 delete[] p;