簡體   English   中英

寫入文件時由 delete[] 引起的分段錯誤

[英]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 后者創建一個指向長度為Nchar數組的指針,並保留未定義的值。

當然,要將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM