Стек вокруг переменной 'dim' (не массив) был поврежден

Я пытаюсь прочитать из двоичного файла, используя fstream, некоторые данные, которые я ранее записал туда.

Проблема в том, что после достижения конца функции показывается сообщение в теме

Код следующий:

ifstream in("contrib.bin", ios::in | ios::binary );

char *nume, dim;
in.read((char*)&dim, sizeof(int));
nume = new char[dim + 1];
in.read(nume, dim);
nume[dim] = '\0';
double imp;
in.read((char*)&imp, sizeof(double));

delete [] nume;

Итак, я сделал свою домашнюю работу и искал эту проблему, но у других людей, которые сталкивались с ней, были массивы, тогда как моя переменная — это простой символ.

Может кто-нибудь указать мне правильное направление, пожалуйста?


person Cristina_eGold    schedule 11.01.2013    source источник
comment
Вместо необработанных массивов и new и delete используйте std::vector или std::string, в зависимости от того, как вы собираетесь использовать данные. Чтобы передать указатель на первый байт вектора или строки v, используйте &v[0]. Однако обратите внимание, что в отличие от текущего кода это UB для размера 0, поэтому вам нужно проверить размер 0 (если это может произойти).   -  person Cheers and hth. - Alf    schedule 11.01.2013


Ответы (3)


Код

char dim;
in.read((char*)&dim, sizeof(int));

определяет 1-байтовый символ, а затем считывает в него sizeof(int) байта (что, вероятно, больше 1). Это неверно и может повредить ваш стек.

Если вам нужно прочитать sizeof(int) байт, объявите dim как int. В противном случае измените количество байтов, которые вы читаете, на 1. Было бы лучше, если бы вы также использовали sizeof(dim), чтобы гарантировать, что вы читаете только столько байтов, сколько вы предоставили для хранения:

in.read((char*)&dim, sizeof(dim));
person simonc    schedule 11.01.2013
comment
Это может повредить стек. Насколько нам известно, это также могло отправить компьютер в полет через всю комнату. ;-) - person netcoder; 11.01.2013
comment
считывает 4 байта не обязательно верно, поскольку sizeof(int) зависит от платформы более чем одним способом (размер байта и количество битов, используемых для int). - person Agentlien; 11.01.2013
comment
@netcoder Я знаю, что в целом это не совсем так, но, поскольку в вопросе упоминалась ошибка повреждения стека, я подумал, что это справедливое предположение. Я обновил свой ответ в соответствии с тем, что вы предлагали. - person simonc; 11.01.2013
comment
Намного лучше. :) Вы получаете вкусный +1, чтобы жевать. - person Agentlien; 11.01.2013
comment
(которое будет больше 1) не обязательно верно. обычно это правда, и в случае с ОП это, вероятно, в подавляющем большинстве случаев верно. но не как общее утверждение. - person Cheers and hth. - Alf; 11.01.2013
comment
@Cheersandhth.-Alf stackoverflow.com/a/589684/311966 подразумевает, что int всегда будет не менее 2 байтов (при условии, что 8 бит на байт). Или я неправильно понимаю? - person simonc; 11.01.2013
comment
@simonc Вы не можете использовать восьмибитные байты. Они могут быть крупнее. Если CHAR_BIT >= 16, sizeof(int) может быть 1. - person Daniel Fischer; 11.01.2013

in.read((char*)&dim, sizeof(int)); неверно, dim содержит только sizeof(char), что является одним, но вы пытаетесь прочитать в него sizeof(int).

После этого все перчатки сняты.

person Luchian Grigore    schedule 11.01.2013
comment
Если только sizeof(int) не окажется 4. Необычно, но не невозможно. - person Pete Becker; 11.01.2013
comment
@PeteBecker, ты имеешь в виду, что это 1? - person Luchian Grigore; 11.01.2013

Ну, вы определяете символ, а затем читаете в размере int. Это будет первая проблема

char *nume, dim;
in.read((char*)&dim, sizeof(char));
person rerun    schedule 11.01.2013