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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
#1

Ошибка при завершении программа. - C++

18.06.2011, 20:19. Просмотров 1749. Ответов 47
Метки нет (Все метки)

Проблема в следующим когда я создаю динамический массив объект при завершении программы вылетает ошибка не пойму в чем проблема ???
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <Windows.h>
using namespace std;
class CBook
{
public:
    CBook(void);
    void Input(char *author1,char *title1);
    void Show ();
    ~CBook(void);
private:
    char *author;
    char *title;
};
CBook::CBook(void)
{
 
}
void CBook::Input(char *author1,char *title1)
{
        author=new char [strlen(author1)+1];
        strcpy(author,author1);
        title=new char [strlen(title1)+1];
        strcpy(title,title1);
 
}
void CBook::Show()
{
    cout<<"Автор:"<<author<<endl;
    cout<<"Название книги:"<<title<<endl;
}
 
CBook::~CBook(void)
{
    delete []author;    
    delete []title;
}
 
void AddBook(CBook *&book,int &size)
{
    CBook *temp=new CBook [size+=1];
    for (int i=1;i<=size-1;i++)
    {
        temp[i]=book[i];
    }
    book=new CBook [size];
    for (int i=1;i<=size-1;i++)
    {
        book[i]=temp[i];
    }
    //delete []temp;
}
void main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    char author[20];
    char title[20];
    int key=0;
    int size=0;
    CBook *book;
    do
    {
        cout<<"1.Добавить книгу"<<endl;
        cout<<"2.Вывести книги"<<endl;
        cout<<"0.Выход"<<endl;
        cin>>key;
        switch (key)
        {
        case 1:
            {
                cin.ignore();
                cout<<"Введите Автора:";
                cin.getline(author,20);
                cout<<"Введите название книги:";
                cin.getline(title,20);
                if (size>0)
                {
                    AddBook(book,size);
                }
                else 
                {
                    book=new CBook[size+=1];
                }
                book[size].Input(author,title);
            }break;
        case 2:
            {
                for (int i=1;i<=size;i++)
                {
                    book[i].Show();
                }
            }break;
        case 0:
            {
                exit(0);
            }break;
            delete []book;
            
        }
    
    }while(key);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2011, 20:19     Ошибка при завершении программа.
Посмотрите здесь:

Ошибка при завершении программа. - C++
Проблема в следующим когда я создаю 3 объект case 1 и пробую после этого вывести case 2 вылетает ошибка в чем проблема ??? #include...

Ошибка при завершении программы - C++
Добрый вечер! Помогите плиз, у меня после завершения программы она зависает... Методом тыка) определил что после завершения проги,...

ошибка при завершении программы - C++
возникает ошибка при завершении программы. при чем после вывода на экран последней строчки. с чем это может быть связано?

Ошибка при завершении работы программы - C++
Написал программу, но при завершении выдает ошибку. Помогите понять с чем это связанно?

Ошибка компилятора при завершении программы - C++
Я так подозреваю, что где то происходит выход за пределы массива. Хоть vector используй, хоть любую другую структуру, класс или массив,...

Ошибка "Stack around the variable 'a' was corrupted" при завершении программы - C++
Учусь создавать списки. Идея такова чтобы создать список в отдельном cpp, а пользователь имел доступ только к функциям добавления, удаления...

Ошибка в завершении работы программы - C++
... char s1; std::cout&lt;&lt;&quot;Enter the file name\n&quot;; std::cin&gt;&gt;s1; if ((f=fopen(s1,&quot;r&quot;))==NULL) { perror(&quot;&quot;); ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
tylix
68 / 55 / 6
Регистрация: 10.06.2011
Сообщений: 149
18.06.2011, 20:37     Ошибка при завершении программа. #2
delete [] 98я никогда не будет выполнена

Добавлено через 2 минуты
83я где проверка, что память была выделена?
и второе выделяешь как book[0]
а запись идет в book[1]
т.е. book[size]
book[size+1]
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
18.06.2011, 20:39     Ошибка при завершении программа. #3
да уж.
83 строка смущает немного.
tylix
68 / 55 / 6
Регистрация: 10.06.2011
Сообщений: 149
18.06.2011, 20:44     Ошибка при завершении программа. #4
book[size].Input(author,title);
C++
1
book[size-1].Input(author,title);
я предпочитаю выделять память сразу для n-го кол-ва объектов, или использовать динам. список
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 20:51     Ошибка при завершении программа. #5
85 book[size-1].Input(author,title);

89 for (int i=0;i<size;i++)

пофиксит.
delete []book; никогда не отработает, по этому его до exit(0) ставить надо.
83 строка нормально, хоть и не сиондартно ++size, адекватная замена.

Добавлено через 4 минуты
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void AddBook(CBook *&book,int &size)
{
        CBook *temp=new CBook [size+=1];
        for (int i=1;i<=size-1;i++)
        {
                temp[i]=book[i];
        }
        book=new CBook [size];
        for (int i=1;i<=size-1;i++)
        {
                book[i]=temp[i];
        }
        //delete []temp;
}
опять же проблема с индексацией, откуда это? Запомните в массиве индексация всегда начинается с 0 и заканчивается n-1.
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 20:54  [ТС]     Ошибка при завершении программа. #6
Ппц я не пойму все ровно в чем проблема все ваши замечания проверил и не одно из них не помогло

если можно исправлений код ???
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 20:59     Ошибка при завершении программа. #7
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <Windows.h>
using namespace std;
class CBook
{
public:
    CBook(void);
    void Input(char *author1,char *title1);
    void Show ();
    ~CBook(void);
private:
    char *author;
    char *title;
};
CBook::CBook(void)
{
    author=NULL;
    title=NULL;
}
void CBook::Input(char *author1,char *title1)
{
    author=new char [strlen(author1)+1];
    strcpy(author,author1);
    title=new char [strlen(title1)+1];
    strcpy(title,title1);
 
}
void CBook::Show()
{
    cout<<"Автор:"<<author<<endl;
    cout<<"Название книги:"<<title<<endl;
}
 
CBook::~CBook(void)
{
    if(author!=NULL&&title!=NULL)
    {
        delete []author;        
        delete []title;
    }
}
 
void AddBook(CBook *&book,int &size)
{
    CBook *temp=new CBook [++size];
    for (int i=0;i<size;i++)
    {
        temp[i]=book[i];
    }
    book=new CBook [size];
    for (int i=1;i<=size-1;i++)
    {
        book[i]=temp[i];
    }
}
void main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    char author[20];
    char title[20];
    int key=0;
    int size=0;
    CBook *book;
    do
    {
        cout<<"1.Добавить книгу"<<endl;
        cout<<"2.Вывести книги"<<endl;
        cout<<"0.Выход"<<endl;
        cin>>key;
        switch (key)
        {
        case 1:
            {
                cin.ignore();
                cout<<"Введите Автора:";
                cin.getline(author,20);
                cout<<"Введите название книги:";
                cin.getline(title,20);
                if (size>0)
                {
                    AddBook(book,size);
                }
                else 
                {
                    book=new CBook[++size];
                }
                book[size-1].Input(author,title);
            }break;
        case 2:
            {
                for (int i=0;i<size;i++)
                {
                    book[i].Show();
                }
            }break;
        case 0:
            {
                delete []book;
                return;
            }break;
        }
 
    }while(key);
}
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 21:05  [ТС]     Ошибка при завершении программа. #8
Цитата Сообщение от silentnuke Посмотреть сообщение
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <Windows.h>
using namespace std;
class CBook
{
public:
    CBook(void);
    void Input(char *author1,char *title1);
    void Show ();
    ~CBook(void);
private:
    char *author;
    char *title;
};
CBook::CBook(void)
{
    author=NULL;
    title=NULL;
}
void CBook::Input(char *author1,char *title1)
{
    author=new char [strlen(author1)+1];
    strcpy(author,author1);
    title=new char [strlen(title1)+1];
    strcpy(title,title1);
 
}
void CBook::Show()
{
    cout<<"Автор:"<<author<<endl;
    cout<<"Название книги:"<<title<<endl;
}
 
CBook::~CBook(void)
{
    if(author!=NULL&&title!=NULL)
    {
        delete []author;        
        delete []title;
    }
}
 
void AddBook(CBook *&book,int &size)
{
    CBook *temp=new CBook [++size];
    for (int i=0;i<size;i++)
    {
        temp[i]=book[i];
    }
    book=new CBook [size];
    for (int i=1;i<=size-1;i++)
    {
        book[i]=temp[i];
    }
}
void main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    char author[20];
    char title[20];
    int key=0;
    int size=0;
    CBook *book;
    do
    {
        cout<<"1.Добавить книгу"<<endl;
        cout<<"2.Вывести книги"<<endl;
        cout<<"0.Выход"<<endl;
        cin>>key;
        switch (key)
        {
        case 1:
            {
                cin.ignore();
                cout<<"Введите Автора:";
                cin.getline(author,20);
                cout<<"Введите название книги:";
                cin.getline(title,20);
                if (size>0)
                {
                    AddBook(book,size);
                }
                else 
                {
                    book=new CBook[++size];
                }
                book[size-1].Input(author,title);
            }break;
        case 2:
            {
                for (int i=0;i<size;i++)
                {
                    book[i].Show();
                }
            }break;
        case 0:
            {
                delete []book;
                return;
            }break;
        }
 
    }while(key);
}
У меня Код сработал неправильно именно при 2 добавлении объекта пробую выводить и тут ошибка
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
18.06.2011, 21:11     Ошибка при завершении программа. #9
может быть, проблема в отсутствии конструктора копирования?
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 21:15  [ТС]     Ошибка при завершении программа. #10
Когда я пробовал проанализировать в чем проблема заметил что код работает если закоментировать все обращение к title и работает все как положено возможна вы поймете в чем проблема !!!
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <Windows.h>
using namespace std;
class CBook
{
public:
        CBook(void);
        void Input(char *author1/*,char *title1*/);
        void Show ();
        ~CBook(void);
private:
        char *author;
       /* char *title;*/
};
CBook::CBook(void)
{
 
}
void CBook::Input(char *author1/*,char *title1*/)
{
                author=new char [strlen(author1)+1];
                strcpy(author,author1);
                /*title=new char [strlen(title1)+1];
                strcpy(title,title1);*/
 
}
void CBook::Show()
{
        cout<<"Автор:"<<author<<endl;
        /*cout<<"Название книги:"<<title<<endl;*/
}
 
CBook::~CBook(void)
{
        delete []author;        
     /*   delete []title;*/
}
 
void AddBook(CBook *&book,int &size)
{
        CBook *temp=new CBook [size+=1];
        for (int i=1;i<=size-1;i++)
        {
                temp[i]=book[i];
        }
        book=new CBook [size];
        for (int i=1;i<=size-1;i++)
        {
                book[i]=temp[i];
        }
        //delete []temp;
}
void main()
{
        SetConsoleOutputCP(1251);
        SetConsoleCP(1251);
        char author[20];
   /*     char title[20];*/
        int key=0;
        int size=0;
        CBook *book;
        do
        {
                cout<<"1.Добавить книгу"<<endl;
                cout<<"2.Вывести книги"<<endl;
                cout<<"0.Выход"<<endl;
                cin>>key;
                switch (key)
                {
                case 1:
                        {
                                cin.ignore();
                                cout<<"Введите Автора:";
                                cin.getline(author,20);
                               /* cout<<"Введите название книги:";
                                cin.getline(title,20);*/
                                if (size>0)
                                {
                                        AddBook(book,size);
                                }
                                else 
                                {
                                        book=new CBook[size+=1];
                                }
                                book[size].Input(author/*,title*/);
                        }break;
                case 2:
                        {
                                for (int i=1;i<=size;i++)
                                {
                                        book[i].Show();
                                }
                        }break;
                case 0:
                        {
                                exit(0);
                        }break;
                        delete []book;
                        
                }
        
        }while(key);
}
Добавлено через 2 минуты
Цитата Сообщение от no0ker Посмотреть сообщение
может быть, проблема в отсутствии конструктора копирования?
Тоже пробовал но не помогло ((
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 21:22     Ошибка при завершении программа. #11
Цитата Сообщение от DigsiL Посмотреть сообщение
У меня Код сработал неправильно именно при 2 добавлении объекта пробую выводить и тут ошибка
угу есть такой косяк. нужно переписать функцию AddBook на такую:

C++
1
2
3
4
5
6
7
8
9
void AddBook(CBook *&book,int &size)
{
        CBook *temp=new CBook [++size];
        for (int i=0;i<size;i++)
        {
                temp[i]=book[i];
        }
        book=temp;
}
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 22:08  [ТС]     Ошибка при завершении программа. #12
Цитата Сообщение от silentnuke Посмотреть сообщение
угу есть такой косяк. нужно переписать функцию AddBook на такую:

C++
1
2
3
4
5
6
7
8
9
void AddBook(CBook *&book,int &size)
{
        CBook *temp=new CBook [++size];
        for (int i=0;i<size;i++)
        {
                temp[i]=book[i];
        }
        book=temp;
}
Я в шоке как твой код сработал правильно
если это запись болие правильней ???
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void AddBook(CBook *&book,int &size)
{
        CBook *temp=new CBook [++size];
        for (int i=0;i<size;i++)
        {
                temp[i]=book[i];
        }
        book=new CBook [size];
        for (int i=1;i<=size-1;i++)
        {
                book[i]=temp[i];
        }
}
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 22:17     Ошибка при завершении программа. #13
Цитата Сообщение от DigsiL Посмотреть сообщение
Я в шоке как твой код сработал правильно
если это запись болие правильней ???
Ибо матчасть учить надо.
Рассмотрим подробно, что делаете вы:
1.Создаете указатель temp на size+1 объектов.
2. Копируете туда все объекты из старой памяти.
3. Выделяете новую память book на size+1 объектов.
4.копируете туда все из temp.
А теперь рассмотрим, что сделал я:
1. Создаю указатель temp на size+1 объектов.
2. Копирую туда все объекты из старой памяти.
3. Перебрасываю указатель book на выделенную память temp.
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
18.06.2011, 22:24     Ошибка при завершении программа. #14
silentnuke, а указатель book перед пунктом 3 очистить не надо? он же на массив указателей указывает, перед переброской.

Добавлено через 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
#include<iostream>
class A{
    public:
 
    A(){}
    ~A(){}
 
    A operator =(A&){
        std::cout<<"operator = \n";
    }
};
 
int main(){
 
    A* z;
    z=new A[1];
 
    A* zz;
    zz=new A[1];
 
    zz[0] = z[0];
 
    delete[] zz;
    delete[] z;
}
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 22:32  [ТС]     Ошибка при завершении программа. #15
Цитата Сообщение от no0ker Посмотреть сообщение
silentnuke, а указатель book перед пунктом 3 очистить не надо? он же на массив указателей указывает, перед переброской.

Добавлено через 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
#include<iostream>
class A{
    public:
 
    A(){}
    ~A(){}
 
    A operator =(A){
        std::cout<<"operator = \n";
    }
};
 
int main(){
 
    A* z;
    z=new A[1];
 
    A* zz;
    zz=new A[1];
 
    zz[0] = z[0];
 
    delete[] zz;
    delete[] z;
}
Хм мы еще не проходили толком конструктор копирование

Добавлено через 5 минут
Цитата Сообщение от silentnuke Посмотреть сообщение
Ибо матчасть учить надо.
Рассмотрим подробно, что делаете вы:
1.Создаете указатель temp на size+1 объектов.
2. Копируете туда все объекты из старой памяти.
3. Выделяете новую память book на size+1 объектов.
4.копируете туда все из temp.
А теперь рассмотрим, что сделал я:
1. Создаю указатель temp на size+1 объектов.
2. Копирую туда все объекты из старой памяти.
3. Перебрасываю указатель book на выделенную память temp.
Но все так как я сделал должно быть правильней чем как у Вас вить действительность память надо для book выделить и перекопировать а потом temp уничтожить.
Как я понимаю ))
no0ker
18.06.2011, 22:36
  #16

Не по теме:

предлагаю сначала переопределить оператор "=" =)

pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
18.06.2011, 22:39     Ошибка при завершении программа. #17
string-ом надо пользоваться
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 22:40  [ТС]     Ошибка при завершении программа. #18
Цитата Сообщение от no0ker Посмотреть сообщение

Не по теме:

предлагаю сначала написать вменяемый конструктор копирования =)

Был бы премного благодарен если ты смог его показать на примере моей программы ))

Добавлено через 35 секунд
Цитата Сообщение от pito211 Посмотреть сообщение
string-ом надо пользоваться
Проблема в том что я его еще не учил и использовать нельзя (
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 22:42     Ошибка при завершении программа. #19
Цитата Сообщение от no0ker Посмотреть сообщение
silentnuke, а указатель book перед пунктом 3 очистить не надо? он же на массив указателей указывает, перед переброской.

Добавлено через 1 минуту
и как ваш код работает без явного конструктора копирования.
вот тут,например, конструктор копирования используется.
стоп стоп.
идем по пунктам:
1. очищать не надо, т.к. было произведено побитовое копирование полей.
2. Давайте называть вещи своими именами? Конструктор копирования вызывается все в 3х случаях:
• Срабатывает через инициализацию другим объектом.
• Срабатывает при передаче в функцию
• При возврате из функции
А то что приведено в вашем коде, называется перегрузкой операторов. Можно перегрузить оператор равно, но у меня лично не было желания. в данном примере можно обойтись как раз побитовым копированием полей.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2011, 22:46     Ошибка при завершении программа.
Еще ссылки по теме:

сделать при завершении - C++
господа можно ли в консольном приложении сделать так,что бы при закрытии окна(например нажатие на крестик)выводилась надпись(любая)

Закрытие именованного канала при завершении работы программы - C++
Добрый день. Пример: int main() { CreateNamedPipe(...); return 0; }

Очистка памяти при завершении работы функции, как правильно возвращать значения? - C++
Я вывел для себя 2 способа возвращать значения работы функции string Add(string a1, string a2) { string returnStr; returnStr +=...

Ошибка при компиляции, нужно чтобы программа сделала выбор - C++
Здравствуйте. Пытаюсь решить формулу (вычислить высоту треугольника) с помощью С++, не могу сделать так чтобы программа сделала выбор когда...

Ошибка на этапе выполнения при том, что программа выполняется до конца - C++
Есть матрица с заданным кол-вом столбцов и строк, которую надо сдвинуть, на выбор, во все 4 направления и наискосок. Программа, в принципе,...


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

Или воспользуйтесь поиском по форуму:
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
18.06.2011, 22:46     Ошибка при завершении программа. #20
pito211, и vector =) раз уж на то пошло.

Добавлено через 3 минуты

Не по теме:

silentnuke, насчет побитового копирования полей - разумно, согласен.

Yandex
Объявления
18.06.2011, 22:46     Ошибка при завершении программа.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru