Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

операторы new и delete

333
28 июля 2006 года
GHopper
200 / / 28.12.2004
Здравствуйте.
В консольном приложении есть некоторый буфер:

char* buf;

Использую его в цикле:

while (!feof(streamIN))
{
buf = new char[BUF_SIZE];
memset(str, 0, BUF_SIZE);

...

delete[] buf;
}

Так вот. Если BUF_SIZE = 10, то вылетает ошибка. Если поставить его 100, то все ОК. Как это понимать???
240
28 июля 2006 года
aks
2.5K / / 14.07.2006
1. Что такое str, к которому обращаються. В примере он не описан - только buf.
2. Текст ошибки тоже желательно )
279
28 июля 2006 года
bave
456 / / 07.03.2004
могу только предположить, что ты в этот buf пытаешся копировать что-то большее чем 10 байт. Хотя из того, что есть в вопросе этого не видно.
Лучше напиши всё что у тебя внутри цикла. И зачем тебе вообще в цикле память выделять каждый раз?
333
28 июля 2006 года
GHopper
200 / / 28.12.2004
Пример выше я придумал для вопроса. На самом деле у меня есть следующая функция:

bool ConvLog(char* fileIN, char* fileOUT)
{
FILE* streamIN;
FILE* streamOUT;

if( ((streamIN = fopen(fileIN, "r+t" ))!=NULL) &&
((streamOUT = fopen(fileOUT, "w+t" ))!=NULL) )
{
while (!feof(streamIN))
{
buf = new char[BUF_LEN];
memset(buf, 0, BUF_LEN);
fgets(buf, 100, streamIN);
if (buf[0]=='$')
{
tel = new char[TEL_LEN];
memset(tel, 0, TEL_LEN);
strcpy(tel, buf+1);
fgets(buf, 10, streamIN);
for(int i=0; i<10; i++)
{
str = new char[STR_LEN];
fgets(buf, 100, streamIN);
for (int y=0; y<10; y++)
{
memset(str, 0, STR_LEN);
strcpy(str, tel);
LastDigit(str+4, i*10+y);
for(int z=0; z<6; z++)
{
str[8+z]=buf[y*7+z];
}
fputs(str, streamOUT);
}
delete[] str;
}
delete[] tel;
}
delete[] buf;
}
fclose(streamIN);
fclose(streamOUT);
return true;
}
else
return false;
}

Я понимаю, что совсем не обязательно выделять память в цикле (совсем даже наоборот), но так уж получилось... и вот столкнулся с проблемой! Если TEL_LEN меньше 25, то эта функция вызывает ошибку, если больше - ошибки нет. Вопрос не в том как нужно писать, а в том почему возникает такая проблема.
279
28 июля 2006 года
bave
456 / / 07.03.2004
Если я правильно помню работу функции fgets, то вот пчему:

fgets(buf, 100, streamIN); //!!!! 100

Читаешь в паямть по указателю buf, которой ты выделил всего 10 байт -
100 байт из потока. - ессествено возникает ошибка. ПРичём ошибка я
скорее всего вылетает в процессе выполнения программы.

Ну и вот еще что:
strcpy(tel, buf+1);

Ты уверен, что (buf+1) указывает на строку закрытую двоичным нулём
(т. е. '\0')??? - если нет, то strcpy(tel, buf+1); - возможно будет приводить к ошибке.
Лучше использовать strncpy(tel, buf+1, TEL_LEN);
-----------------------------------------------
Вот это то что увидел беглым взглядом.
333
29 июля 2006 года
GHopper
200 / / 28.12.2004
Замечание справедливое, но не в нем дело. У меня определено в программе

#define TEL_LEN 10
#define BUF_LEN 100
#define STR_LEN 50

Поэтому fgets(buf, 100, streamIN) - вполне справедливо, но конечно лучше перепешу на fgets(buf, BUF_LEN, streamIN).

Нашол я в чем проблема - гон исключительно мой. Лог файл, который обрабатывает моя функция имел следующий вид:

...
$7400

614067 663945 059687 594525 093055 044870 781313 166890 126626 510525
282804 632782 710702 435471 731300 445827 641549 249291 996663 749551
481525 049237 591198 624040 963892 200071 838362 702309 236170 877169
...

И первая строка имеет длинну не 6 байт (как я наивно пологал), аа 21. Отсюда и все проблемы...
Просто нужно заменить strcpy(tel, buf+1); на strncpy(tel, buf+1, TEL_LEN); и все!

Всем спасибо за внимание! Закрываем тему.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог