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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
DigsiL
9 / 9 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 20:19     Ошибка при завершении программа. #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
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);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
137 / 138 / 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
9 / 9 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 20:54  [ТС]     Ошибка при завершении программа. #6
Ппц я не пойму все ровно в чем проблема все ваши замечания проверил и не одно из них не помогло

если можно исправлений код ???
silentnuke
Android Programmer
137 / 138 / 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
9 / 9 / 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
9 / 9 / 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
137 / 138 / 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
9 / 9 / 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
137 / 138 / 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
9 / 9 / 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
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
18.06.2011, 22:39     Ошибка при завершении программа. #17
string-ом надо пользоваться
DigsiL
9 / 9 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 22:40  [ТС]     Ошибка при завершении программа. #18
Цитата Сообщение от no0ker Посмотреть сообщение

Не по теме:

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

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

Добавлено через 35 секунд
Цитата Сообщение от pito211 Посмотреть сообщение
string-ом надо пользоваться
Проблема в том что я его еще не учил и использовать нельзя (
silentnuke
Android Programmer
137 / 138 / 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++ Ошибка с массивом: программа при вводе "ступорится" при нажатии клавиши Enter
C++ Ошибка компилятора при завершении программы
C++ Ошибка "Stack around the variable 'a' was corrupted" при завершении программы
C++ Очистка памяти при завершении работы функции, как правильно возвращать значения?

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

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

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

Не по теме:

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

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

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