就是写了一个小程序,用到了动态申请内存的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指向你申请空间的部分内存,并不是全部的