[英]segmentation fault cause by delete[] while writing to a file
我正在嘗試寫入文件,當我刪除分配的 memory 時出現分段錯誤。 我不明白是什么問題,請幫助:
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 ***
那么問題是什么?
謝謝!
這個:
char *text = new char(len);
應該:
char *text = new char[len + 1];
無論如何,這都是不必要的。 你為什么這樣做?
char *text = new char(len);
只分配一個字符。 嘗試:
char *text = new char[len];
好吧, delete[]
不平衡new char(N)
,它平衡new char[N]
。 前者創建一個指向單個char
的指針並為其賦值N
; 后者創建一個指向長度為N
的char
數組的指針,並保留未定義的值。
當然,要將std::string
寫入FILE *
,為什么不這樣做:
fwrite(msg.c_str(), sizeof(char), msg.size() + 1, _log);
請注意,保留尾隨 null 字符; 您的原始代碼也是如此。
嘗試這個:
char *text = new char[len];
然后:
delete[] text;
盡管技術問題已得到解答( 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 集合來處理輸入和 output,對於日志文件, ofstream
class 似乎特別適用。
std::ofstream _log("myLogFile");
void writeToLog(std::string const& msg) { // by reference (no copy)
_log << msg;
}
注意它是多么簡單? 而且您也不能忘記close
文件,因為如果您忘記了,那么無論如何都會在_log
被破壞時將其關閉。
當然,此時人們可能會認為擁有 function 是多余的。 然而,這樣的 function 允許您為消息添加前綴,通常帶有時間戳/PID/線程 ID 或其他裝飾,所以它仍然很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.