Форум программистов, компьютерный форум CyberForum.ru

Ошибка времени выполнения. - C++

Восстановить пароль Регистрация
 
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
23.10.2011, 00:41     Ошибка времени выполнения. #1
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void Add_Kod (  _kod*& KodBuf, int a, char* buf, char* buf2)
{
    if(a==1)
    {
        KodBuf = new _kod[1];
        KodBuf[0].ch = *(buf);
        strcpy( KodBuf[0].KodNAme, buf2);
    }
    else
    {
        _kod* CopyKodBuf = new _kod[a-1];
 
        for(int i=0; i<a-1; i++)
        {
            CopyKodBuf[i].ch = KodBuf[i].ch;
            strcpy( CopyKodBuf[i].KodNAme, KodBuf[i].KodNAme);
        }
 
        delete [] KodBuf;
 
        KodBuf = new _kod [a];
        
        for(int i=0; i<a-1; i++)
        {
            KodBuf[i].ch = CopyKodBuf[i].ch;
            strcpy( KodBuf[i].KodNAme, CopyKodBuf[i].KodNAme);
        }
 
        delete [] CopyKodBuf;
 
        KodBuf[a].ch = *(buf);
        strcpy( KodBuf[a].KodNAme, buf2);
    }
}
Воспользовался отладчиком, ошибка возникает вот тут
C++
1
delete [] KodBuf;
Почему не могу понять.В чем проблема?

Не по теме:

вот сама структура _kod

C++
1
2
3
4
5
struct _kod
{
    char ch;
    char KodNAme[3];
};

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
23.10.2011, 03:02     Ошибка времени выполнения. #2
Эта ошибка проявляется, когда происходит выход за границы массива.
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
23.10.2011, 07:40     Ошибка времени выполнения. #3
Теоретически, у вас может быть вызов Add_Kod, когда KodBuf == NULL или KodBuf == мусор, и при этом a != 1 (т.е. когда в вашей функции выполняется else). И если случай при KodBuf == NULL вызвал бы исключение при доступе к члену. То случай когда KodBuf == мусор может вызвать исключение при delete [] KodBuf.
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
23.10.2011, 12:48  [ТС]     Ошибка времени выполнения. #4
Цитата Сообщение от bigredcat Посмотреть сообщение
Теоретически, у вас может быть вызов Add_Kod, когда KodBuf == NULL или KodBuf == мусор, и при этом a != 1 (т.е. когда в вашей функции выполняется else). И если случай при KodBuf == NULL вызвал бы исключение при доступе к члену. То случай когда KodBuf == мусор может вызвать исключение при delete [] KodBuf.
Ну это да, тока у меня эта функция вызывается из другой, а в свою очередь в той, читается строка разбивается на подстроки, увеличивается на 1 переменная а. И тока потом вызывается функция Add_Kod(...).Так что в этом с этим вроде всё норм.

Добавлено через 3 минуты
Цитата Сообщение от Chelioss Посмотреть сообщение
Эта ошибка проявляется, когда происходит выход за границы массива.
Уверен? Вроде бы и не выходит за границы.Или я плохо посмотрел
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
23.10.2011, 14:41     Ошибка времени выполнения. #5
Ну, показывайте вызывающую функцию.
Кстати, Add_Kod выделяет память для KodBuf, но не освобождает ее в конечном итоге. Где освобождение происходит? Предполагаю в вызывающей функции, может стоит и распределение туда перенести.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
23.10.2011, 15:42     Ошибка времени выполнения. #6
Цитата Сообщение от Ree.exe Посмотреть сообщение
Уверен? Вроде бы и не выходит за границы.Или я плохо посмотрел
Если KodBuf указывает на недействительную память, то действительно, дело не в выходе за границу массива.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2011, 15:46     Ошибка времени выполнения.
Еще ссылки по теме:

C++ олимпиада, превышение времени выполнения
Подсчет времени выполнения функции C++
C++ Ошибка времени выполнения (terminate)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
23.10.2011, 15:46  [ТС]     Ошибка времени выполнения. #7
Цитата Сообщение от bigredcat Посмотреть сообщение
Ну, показывайте вызывающую функцию.
Кстати, Add_Kod выделяет память для KodBuf, но не освобождает ее в конечном итоге. Где освобождение происходит? Предполагаю в вызывающей функции, может стоит и распределение туда перенести.
Да в конце концов KodBuf будет удалён в вызывающей функции.(ну то есть в Kod(..) )
Вот кусок этой функции, дальше просто не делал(тк, как для дальнейшей работы нужно содержимое KodBuf)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
bool Kod(const char* file_name, const char* kod_file_name)
{
    bool flag = true;
 
    ifstream file( file_name, ios::in, 0x30 );
    ifstream kod_file( kod_file_name, ios::in, 0x30 );
    ofstream output_file( "Output.txt" );
 
    char mas[256]; //Буфер для записи строки файла
    char * buf;    //Указатиль на символ
    char * buf2;   //Указатиль на код символа
    _kod* KodBuf;  //Для динамического буфера символов и их кодов
    
    int kol = 0;
 
    if( kod_file.is_open() )
    {
        while( !kod_file.eof() )
        {
            kod_file.getline(mas,256,'\n');
 
            kol++;
 
            buf = strtok(mas," ");
            buf2 = strtok(NULL," ");
 
            Add_Kod( KodBuf, kol, buf, buf2 );
        }
        kod_file.close();
    }
    else
    {
        flag= false;
        cout<<"Файл не найден!"<<endl
            <<"проверьте существует ли файл: " << kod_file_name <<endl;
    }
 
// Тут работаю с файлами kod_file & output_file обрабатываю содержимое первого и записываю во   второй.
//  И тока тут удаляю KodBuf
Yandex
Объявления
23.10.2011, 15:46     Ошибка времени выполнения.
Ответ Создать тему
Опции темы

Текущее время: 13:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru