首先看一个程序
#include <iostream>
using namespace std;
int main()
{
int* pData = new int[50];
*(pData + 5) = 10;
//这里需要注意一点就是delete必须是在使用完以后才能将pData删除,否则输出的就是一个
//错误的结果。正如类中析构函数一样,必须是在全部函数调用完以后才会运行
cout << *(pData + 5) << endl;
delete pData;
pData = new int[50];
*(pData + 5) = 10;
cout << *(pData + 5) << endl;
delete[]pData;
return 0;
}
delete只是释放了指针所指第一个对象的内存空间,delete[]则会调用这段内存空间里的每个数据的析构函数,将数据内部变量指针指向的内存也释放掉
#include <iostream>
using namespace std;
class Student
{
private:
char* name;
int age;
public:
Student()
{
name = new char[20];
}
~Student()
{
cout << "Name is been deleted!" << endl;
delete[] name; //这里delete[]对应是char[20],不是之前的student[5]
}
};
int main()
{
Student* student = new Student[5];
delete[] student; //这里还是必须使用delete[],如果只是delete,程序就会出错。因为单纯的delete只是删除了指针指向的第一个
//而没有将剩余的四个删除。
student = NULL;
student = new Student[2];
delete[]student;
return 0;
}
即便返回的时候是一个指针,你也不能只是调用delete,而是要根据指针后面的指向的内容调用delete[]。
大致的意思:new 对应delete;new []对应delete[].