Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
DigsiL
10 / 10 / 3
Регистрация: 14.01.2011
Сообщений: 113
#1

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

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

Проблема в следующим когда я создаю динамический массив объект при завершении программы вылетает ошибка не пойму в чем проблема ???
http://www.cyberforum.ru/cpp-beginners/thread322812.html
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);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2011, 20:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка при завершении программа. (C++):

Visual studio: консольная программа закрывается при завершении
На некоторых студиях приходится в конце программы писать system(&quot;pause&quot;); что...

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

ошибка при завершении программы
возникает ошибка при завершении программы. при чем после вывода на экран...

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

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

47
tylix
68 / 55 / 11
Регистрация: 10.06.2011
Сообщений: 149
18.06.2011, 20:37 #2
delete [] 98я никогда не будет выполнена

Добавлено через 2 минуты
83я где проверка, что память была выделена?
и второе выделяешь как book[0]
а запись идет в book[1]
т.е. book[size]
book[size+1]
1
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
18.06.2011, 20:39 #3
да уж.
83 строка смущает немного.
0
tylix
68 / 55 / 11
Регистрация: 10.06.2011
Сообщений: 149
18.06.2011, 20:44 #4
book[size].Input(author,title);
C++
1
book[size-1].Input(author,title);
я предпочитаю выделять память сразу для n-го кол-ва объектов, или использовать динам. список
0
silentnuke
Android Programmer
139 / 140 / 10
Регистрация: 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.
1
DigsiL
10 / 10 / 3
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 20:54  [ТС] #6
Ппц я не пойму все ровно в чем проблема все ваши замечания проверил и не одно из них не помогло

если можно исправлений код ???
0
silentnuke
Android Programmer
139 / 140 / 10
Регистрация: 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);
}
1
DigsiL
10 / 10 / 3
Регистрация: 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 добавлении объекта пробую выводить и тут ошибка
0
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
18.06.2011, 21:11 #9
может быть, проблема в отсутствии конструктора копирования?
0
DigsiL
10 / 10 / 3
Регистрация: 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 Посмотреть сообщение
может быть, проблема в отсутствии конструктора копирования?
Тоже пробовал но не помогло ((
0
silentnuke
Android Programmer
139 / 140 / 10
Регистрация: 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;
}
1
DigsiL
10 / 10 / 3
Регистрация: 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];
        }
}
0
silentnuke
Android Programmer
139 / 140 / 10
Регистрация: 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.
1
no0ker
101 / 88 / 7
Регистрация: 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;
}
1
DigsiL
10 / 10 / 3
Регистрация: 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 уничтожить.
Как я понимаю ))
0
no0ker
18.06.2011, 22:36
  #16

Не по теме:

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

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

Не по теме:

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

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

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

Добавлено через 1 минуту
и как ваш код работает без явного конструктора копирования.
вот тут,например, конструктор копирования используется.
стоп стоп.
идем по пунктам:
1. очищать не надо, т.к. было произведено побитовое копирование полей.
2. Давайте называть вещи своими именами? Конструктор копирования вызывается все в 3х случаях:
• Срабатывает через инициализацию другим объектом.
• Срабатывает при передаче в функцию
• При возврате из функции
А то что приведено в вашем коде, называется перегрузкой операторов. Можно перегрузить оператор равно, но у меня лично не было желания. в данном примере можно обойтись как раз побитовым копированием полей.
1
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
18.06.2011, 22:46 #20
pito211, и vector =) раз уж на то пошло.

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

Не по теме:

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

0
18.06.2011, 22:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2011, 22:46
Привет! Вот еще темы с решениями:

В чем ошибка? При запуске программы открывается консоль и сразу ошибка о завершении программы
К тому же выдает warning: deprecated conversion from string constant to 'char*'...

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

Ошибка в завершении работы программы
... char s1; std::cout&lt;&lt;&quot;Enter the file name\n&quot;; std::cin&gt;&gt;s1; if...

сделать при завершении
господа можно ли в консольном приложении сделать так,что бы при закрытии...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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