//错误的示例:
std::string stringArray = new std::string[100];
...
delete stringArray;
当你使用new,有两件事发生。
第一,内存被分配出来(通过名为operator new的函数)
第二,针对此内存会有一个(或更多)构造函数被调用。
当你使用delete,也有两件事发生:
针对此内存会有一个(或更多)析构函数被调用
内存被释放(通过operator 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时使用[].