Файл C ++, написанный с незанятым блоком памяти - PullRequest
1 голос
/ 21 июня 2011

Я программировал и ошибка кодирования вызвала проблемы:

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 ]

3 голосов
/ 21 июня 2011

На самом деле невозможно точно знать, почему это произошло так, как это произошло.Вот почему спецификации C ++ называют это «неопределенным поведением»: это то, что находится за пределами определения языка.Возможно, он выполнялся правильно в некоторых реализациях компиляторов / стандартной библиотеки.Возможно, здесь произошел сбой из-за повреждения памяти, вызванного удалением [] указателя, не являющегося массивом.

Вы можете получить жесткий отладчик памяти (re: valgrind), чтобы выяснить точный момент, когда кучаповрежден.Вы можете даже понять, почему объект iostream был поврежден этим.Но это никому не поможет, потому что в другой системе может произойти сбой по совершенно другим причинам.В самом деле, простое введение только отладчика памяти может изменить поведение того, где или когда он выходит из строя.

0 голосов
/ 21 июня 2011

Бесплатно не обязательно является частью проблемы, хотя это определенно ухудшает ситуацию.Вы перезаписываете кучу тем или иным способом, когда читаете файл в выделенный вами однобайтовый буфер.Когда вы пытаетесь открыть другой файл, ему требуется доступ к куче для выделения блоков памяти, и часто происходит сбой, потому что куча была повреждена.Особенно, если вы находитесь в режиме отладки с включенной проверкой памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...