64,647
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
string str;
vector<string> svec;
cout<<"Input:"<<endl;
while(cin>>str)
svec.push_back(str);
if(svec.size()==0){
cout<<"NO DATA!"<<endl;
return -1;
}
string *sp = new string[svec.size()];
string *tp = sp;//这里为什么要这样写才行,直接用sp为什么不行?
for(vector<string>::iterator it=svec.begin();it != svec.end();++it,++tp){
*tp=*it;
cout<<*tp<<" ";
}
cout<<endl;
delete [] sp;
return 0;
}
情况1:
string *sp = new string[svec.size()];
string *tp = sp;//这里为什么要这样写才行,直接用sp为什么不行?
for(vector<string>::iterator it=svec.begin();it != svec.end();++it,++tp)
{
*tp=*it;
cout<<*tp<<" ";
}
cout<<endl;
delete [] sp;
如果不是这样写,而是像下面一样写的话:
情况2:
string *sp = new string[svec.size()];
for(vector<string>::iterator it=svec.begin();it != svec.end();++it,++sp)
{
*sp=*it;
cout<<*sp<<" ";
}
cout<<endl;
delete [] sp;
那么会发生系统级的错误,楼主可以试一下看。
说明一下原因:
string *sp = new string[svec.size()],这里的指针sp指向的
是我们动态分配的string数组的首地址,也就是string数组第一个元素
的地址。 delete[] sp的意思是释放 指针sp指向的元素 为首元素的数
组。因此情况1能够正确释放我们动态分配的string数组。但是情况2,
我们delete[] sp,这里的sp是经过了svec.size()次的++后的sp,然后
用delete[] sp 去释放sp所指元素为首元素的动态分配数组,其实这个动态
分配的内存单元是不存在,因此我们使用deletep[] sp是对一块不存在的
自由存储区进行delete,此时,自由存储区可能会被破坏,因此这样的错误
将是毁灭性的!
string *sp = new string[svec.size()];
for(vector<string>::iterator it=svec.begin();it != svec.end();++it,++sp)
{
*sp=*it;
cout<<*sp<<" ";
}
cout<<endl;
delete [] sp;