我正在尝试写入文件,当我删除已分配的内存时,我会收到分段错误。我不明白是什么问题,请帮忙:
void writeToLog(string msg) {
int len = msg.size()+1;
char *text = new char(len);
strcpy(text,msg.c_str());
char* p = text;
for(int i=0; i<len; i++){
fputc(*p, _log) ;
p++;
}
delete[] text; //THIS IS WHERE IT CRASHES
}
我也试过没有[ ]
,但后来我得到了
*** glibc detected *** ./s: free(): invalid next size (fast): 0x09ef7308 ***
那么问题是什么?
谢谢!
答案 0 :(得分:4)
此:
char *text = new char(len);
应该是:
char *text = new char[len + 1];
无论如何这都是不必要的。你为什么这样做?
答案 1 :(得分:3)
char *text = new char(len);
只分配一个char。试试:
char *text = new char[len];
答案 2 :(得分:3)
好吧,delete[]
不平衡new char(N)
,它平衡new char[N]
。前者创建指向单 char
的指针,并为其赋值N
;后者创建一个指向长度为char
的{{1}}数组的指针,并使值保持不定。
当然,要将N
写入std::string
,为什么不这样做呢?
FILE *
请注意,保留尾随空字符;你的原始代码也是如此。
答案 3 :(得分:0)
试试这个:
char *text = new char[len];
然后:
delete[] text;
答案 4 :(得分:0)
虽然技术问题已经回答(new
/ delete
对不匹配),但我仍然认为您可以从这里获得一些帮助。因此,我建议帮助您修改代码。
首先:如果您只是不执行副本,就不会有任何问题。
void writeToLog(string msg) {
typedef std::string::const_iterator iterator;
for(iterator it = msg.begin(), end = msg.end(); it != end; ++it) {
fputc(*it, _log) ;
}
}
注意我是如何重新编写代码以使用C ++迭代器而不是混合使用指针和索引。
第二:这个fputc
电话是什么?
您不需要在代码中使用FILE*
。如果你这样做,你也可能会弄错它而忘记关闭它,或者关闭它等等......
标准库提供Streams集合来处理输入和输出,对于日志文件,ofstream
类似乎特别适合。
std::ofstream _log("myLogFile");
void writeToLog(std::string const& msg) { // by reference (no copy)
_log << msg;
}
请注意它是如何简单的?你也不能忘记close
这个文件,因为如果你忘记了,那么当_log
被破坏时它也会被关闭。
当然,在这一点上,人们可能会认为拥有一个功能是多余的。但是,这样的函数允许您为消息添加前缀,通常使用时间戳/ PID /线程ID或其他装饰,因此它仍然很好。