c++ new 和delete的问题

intmain(){stringfilename="D:\\3区BallGps0407\\PC01(S301)-T301-bagps.CSV";ifstreamReadF... int main()
{
string filename = "D:\\3区BallGps0407\\PC01(S301)-T301-bagps.CSV";
ifstream ReadFile ;
int len = N_element(filename); //自定义函数统计文件的行数
ReadFile.open(filename,ios::in);
string *str;
str = new string[len+1];
int i = 0;
while(getline(ReadFile,str[i]))
{

i++;
}
for(int j =0;j<len;j++)
{
cout<<str[j]<<endl;
}
delete str;
return 0;
}
我在return前面不加delete的时候运行的时候的结果是正确的,写了delete每次可以编译成功但是运行的时候会出错
展开
 我来答
慕_贵族
2015-05-03 · 超过57用户采纳过TA的回答
知道小有建树答主
回答量:114
采纳率:100%
帮助的人:65.6万
展开全部
这个是C++中的string 库函数关于内存释放的问题!如果你已经申请了一个string 内存对象,那么会自动释放!当你再次调用delete时候,str已经被释放了!所以才会出错,好好看看string库的内存分配使用规则!大概是这样,我也记不太清了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hkys_lxh
2015-05-03 · 超过13用户采纳过TA的回答
知道答主
回答量:47
采纳率:0%
帮助的人:24.3万
展开全部
我在你程序基础上改了,运行并未发现什么异常吗,改后代码如下:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
string filename = "220.cpp";
ifstream ReadFile ;
int len = 100;//N_element(filename); //自定义函数统计文件的行数
ReadFile.open("220.cpp",ios::in);
if(!ReadFile)
{
cout<<"open error!"<<endl;
}//
else
{
cout<<"open success!"<<endl;
}
string *str;
str = new string[len+1];
int i = 0;
while(getline(ReadFile,str[i]))
{
i++;
}
cout<<"文件220.cpp 总行数为"<<i<<endl;

for(int j =0;j<i;j++)
{
cout<<str[j]<<endl;
}
delete str;
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zjfaok
2015-05-03 · TA获得超过6806个赞
知道大有可为答主
回答量:4146
采纳率:62%
帮助的人:1619万
展开全部
delete[] str;

另外这种时候用 vector 就好了嘛,何必用 new[]/delete[] 手动管理内存……
追问
delete[]和delete有什么区别!如果用vector的话,就那个读文件的那一句怎么写,谢谢啊!
追答

如果 new 的是数组(T[]那种,std::vector 和 std::array 等等不算在内),则对应的是 delete[]。否则 new 对应的是 delete(placement new 对应自定义的内存释放方式,那又是另一回事了)


除了把

    string *str;
    str = new string[len+1];

换成

    vector<string> str(len+1);

,以及不需要 delete[] 以外,其他地方应该不需要改动

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式