写入文件时由delete []引起的分段错误

时间:2011-05-28 14:50:43

标签: c++

我正在尝试写入文件,当我删除已分配的内存时,我会收到分段错误。我不明白是什么问题,请帮忙:

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 ***

那么问题是什么?

谢谢!

5 个答案:

答案 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或其他装饰,因此它仍然很好。