当你使用new(通过new动态生成一个对象),有两件事情发生。第一,内存被分配出来。第二,针对此内存会有一个构造函数被调用。当你使用delete也有两件事情发生:针对此内存会有一个析构函数被调用,然后内存才被释放。delete的最大问题在于:即将被删除的内存之内究竟有多少对象?这个问题的答案决定了有多少个析构函数必须被调用起来。

当你对着一个指针使用delete,唯一能够让delete知道内存中是否存在一个“数组大小记录”的办法就是:由你告诉它。

  1. std::string* stringPtr1 = new std::string; 
  2. std::string* stringPtr2 = new std::string[100]; 
  3. ... 
  4. delete stringPtr1;//删除一个对象 
  5. delete [] stringPtr2;//删除一个由对象组成的数组 

如果你调用new时使用[],你必须在对象调用delete时也使用[],如果你调用new时没有使用[],那么也不该在对应调用delete时使用[]。

考虑下面这个typedef:

  1. typedef std::string AddressLines[4];//每个人都地址有4行, 
  2.                                     //每行是一个string 
  3. //由于AddressLines是个数组,如果这样使用new: 
  4. std::string* pal = new AddressLines;//注意,“new AddressLines”返回 
  5.                                     //一个string*,就像 
  6.                                     //"new string[4]"一样 
  7.  
  8. //那么匹配的delete: 
  9. //delete pal; //error! 
  10. delete [] pal;//good! 

 

如果你在new表达式中使用[],必须在相应的delete表达式中也使用[],如果你在new表达式中不使用[],一定不要在相应delete表达式中使用[].