我正在编程并且编码错误导致了问题:
ofstream myFile;
myFile.open("/home/guido/ejemplo.XX",ios::out | ios::binary | ios::trunc);
...
buffer = new char;
delete (buffer);
//write into file with accidentally freed memory block
myFile.close();
...
ifstream sameFile;
sameFile.open("/home/guido/ejemplo.XX",ios::in | ios::binary);
//Crashes at previous line
现在,如果我在ifstream sameFile;
之前评论了所有代码行,sameFile.open(...)
的执行就不会失败。我不确定为什么会这样。程序是否跟踪非法写入/读取的文件? write(...)
和close()
函数在此问题中的作用是什么?
答案 0 :(得分:3)
真的不可能确切地知道它为什么会像它那样崩溃。这就是为什么C ++规范将其称为“未定义的行为”:它是在语言定义之外的东西。它可能已在某些编译器/标准库实现上正确执行。由于非数组指针的delete []引起的内存损坏,它可能在这里失败。
你可以得到一个硬核内存调试器(re:valgrind)来弄清楚堆被破坏的确切时刻。您甚至可能会看到为什么iostream对象被此损坏了。但它并没有真正帮助,因为它可能会因为完全不同的原因而在另一个系统上失败。实际上,仅仅引入内存调试器的行为可能会改变失败的地方或时间的行为。
答案 1 :(得分:0)
免费并不一定是问题的一部分,但这肯定会使情况变得更糟。当您将文件读入分配的单字节缓冲区时,您将以这种或那种方式覆盖堆。当您尝试打开另一个文件时,它需要访问堆以分配内存块,并且通常会因为堆已损坏而崩溃。特别是如果您处于调试模式并且已进行内存检查。