用未分配的内存块写的C ++文件

时间:2011-06-21 00:05:04

标签: c++ file-io

我正在编程并且编码错误导致了问题:

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()函数在此问题中的作用是什么?

2 个答案:

答案 0 :(得分:3)

真的不可能确切地知道它为什么会像它那样崩溃。这就是为什么C ++规范将其称为“未定义的行为”:它是在语言定义之外的东西。它可能已在某些编译器/标准库实现上正确执行。由于非数组指针的delete []引起的内存损坏,它可能在这里失败。

你可以得到一个硬核内存调试器(re:valgrind)来弄清楚堆被破坏的确切时刻。您甚至可能会看到为什么iostream对象被此损坏了。但它并没有真正帮助,因为它可能会因为完全不同的原因而在另一个系统上失败。实际上,仅仅引入内存调试器的行为可能会改变失败的地方或时间的行为。

答案 1 :(得分:0)

免费并不一定是问题的一部分,但这肯定会使情况变得更糟。当您将文件读入分配的单字节缓冲区时,您将以这种或那种方式覆盖堆。当您尝试打开另一个文件时,它需要访问堆以分配内存块,并且通常会因为堆已损坏而崩溃。特别是如果您处于调试模式并且已进行内存检查。