为什么动态申请的string类delete要在数组名前面加[]

就是写了一个小程序,用到了动态申请内存的string类,结果程序到最后总是停止运行
但是查了一下往数组名前面加了一个[]就好了

 #include <iostream>
#include <string> //去除大小写敏感性 MakeLower.()
using namespace std;
int main(void)
{
    int n,i=-1;
    cout<<"请输入行数:";
    cin>>n;
    cout<<"请输入文本:"<<endl;
    string *text=new string[n];
    while(n-1>i++)    cin>> text[i];
    while(i-->=0)    cout<< text[i]<<endl;
    delete []text;
        return 0;
}

就是这样

加上[]说明是一个数组,识别作用

string *text=new string[n];
申请了数组当然用delete[]
如果后面是new string就是用delete了。

new和delete,new [] 和delete[] 要匹配使用.这取决于编译器的实现,因为如果是new []的话,返回的指针不一定是你内存的起始地址,有时候会有一个四个字节
的偏移量来存放需要调用多少次构造函数,同理使用delete[]编译器也会自己去偏移找到起始地址,要不然就是堆内存局部释放,会出错的.当然这也取决于编译
器的实现,所以你要记着,需要匹配使用

因为你new的时候 是从堆里申请了一个空间的字节,所以你删除的时候要删除你申请的空间 所以用delete [];
如果你delete text;那你只是删除text指向你申请空间的部分内存,并不是全部的