当你使用new(通过new动态生成一个对象),有两件事情发生。第一,内存被分配出来。第二,针对此内存会有一个构造函数被调用。当你使用delete也有两件事情发生:针对此内存会有一个析构函数被调用,然后内存才被释放。delete的最大问题在于:即将被删除的内存之内究竟有多少对象?这个问题的答案决定了有多少个析构函数必须被调用起来。
当你对着一个指针使用delete,唯一能够让delete知道内存中是否存在一个“数组大小记录”的办法就是:由你告诉它。
- std::string* stringPtr1 = new std::string;
- std::string* stringPtr2 = new std::string[100];
- ...
- delete stringPtr1;//删除一个对象
- delete [] stringPtr2;//删除一个由对象组成的数组
如果你调用new时使用[],你必须在对象调用delete时也使用[],如果你调用new时没有使用[],那么也不该在对应调用delete时使用[]。
考虑下面这个typedef:
- typedef std::string AddressLines[4];//每个人都地址有4行,
- //每行是一个string
- //由于AddressLines是个数组,如果这样使用new:
- std::string* pal = new AddressLines;//注意,“new AddressLines”返回
- //一个string*,就像
- //"new string[4]"一样
- //那么匹配的delete:
- //delete pal; //error!
- delete [] pal;//good!
如果你在new表达式中使用[],必须在相应的delete表达式中也使用[],如果你在new表达式中不使用[],一定不要在相应delete表达式中使用[].