Форум программистов, компьютерный форум 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);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2011, 20:19     Ошибка при завершении программа.
Посмотрите здесь:

C++ Ошибка при завершении программы
Ошибка при завершении работы программы C++
ошибка при завершении программы C++
C++ сделать при завершении
C++ Ошибка при завершении программа.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
20.06.2011, 19:12     Ошибка при завершении программа. #41
как вариант
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <iostream>
#include <string.h>
#include <windows.h>
 
using namespace std;
class CBook
{
public:
        CBook (void);
        CBook (char *, char *, int);
        CBook (const CBook&);
        CBook& operator = (const CBook&);
        void clear(void);
        friend void swap (CBook&, CBook&);
        void init (char *author1, char *title1, int ID);
        void show(void);
        ~CBook(void);
private:
        int ID;
        char *author;
        char *title;
};
 
CBook::CBook(void){
        author = NULL;
        title = NULL;
        ID = 0;
}
 
CBook::CBook(char *author_, char *title_, int ID_){
        init(author_, title_, ID_);
}
 
CBook::CBook(const CBook& Other){
        init(Other.author, Other.title, Other.ID);
}
 
CBook& CBook::operator=(const CBook &Other){
        if(this!=&Other){
        CBook Tmp(Other);
        swap(*this, Tmp);
        return *this;
        //Tmp удаляется
        }
}
 
void CBook::clear(void){
        if(author!=NULL&&title!=NULL&&ID!=0)
        {
                delete[] author;
                author = NULL;
                delete[] title;
                title = NULL;
                ID = 0;
        }
}
 
void CBook::init(char *author_, char *title_, int ID_){
        ID = ID_;
        author = new char [strlen(author_)+1];
        strcpy(author, author_);
        title=new char [strlen(title_)+1];
        strcpy(title, title_);
}
 
void swap (CBook& One, CBook& Two){
        char *tmp_author, *tmp_title;
        int tmp_id;
        tmp_author = One.author;
        tmp_title = One.title;
        tmp_id = One.ID;
 
        One.author = Two.author;
        One.title = Two.title;
        One.ID = Two.ID;
 
        Two.author = tmp_author;
        Two.title = tmp_title;
        Two.ID = tmp_id;
}
 
void CBook::show(){
    if(ID!=0&&author!=NULL&&title!=NULL){
        cout<<"ID:"<<ID<<endl
            <<"Автор:"<<author<<endl
            <<"Название книги:"<<title<<endl;
    } else {
        cout<<"ID: __"<<endl
            <<"Автор: __"<<endl
            <<"Название книги: __"<<endl;
    }
}
 
CBook::~CBook(void){
        clear();
}
 
void AddBook(CBook *&book, int &size){
        CBook* temp;
        temp = new CBook [++size];
        int i;
 
        for (i=0; i<size-1; ++i){
                temp[i] = book[i];
        }
 
        delete[] book;
        book = NULL;
 
        book = new CBook[size];
 
        for (i=0; i<size-1; ++i){
              book[i] = temp[i];
        }
 
        delete[] temp;
        temp = NULL;
}
 
int main()
{
        SetConsoleOutputCP(1251);
        SetConsoleCP(1251);
        char author[20];
        char title[20];
        int ID=0;
        int key=0;
        int size=0;
        CBook *book=NULL;
        do{
                cout<<"1.Добавить книгу"<<endl
                    <<"2.Вывести книги"<<endl
                    <<"0.Выход"<<endl;
                cin>>key;
                switch (key){
                case 1:{
                                ++ID;
                                //cin.ignore();
                                cout<<"Введите Автора:";
                                //cin.getline(author,20);
                                cin>>author;
                                cout<<"Введите название книги:";
                                //cin.getline(title,20);
                                cin>>title;
                                if (size>0)
                                        AddBook(book, size);
                                else
                                        book = new CBook[++size];
 
                                book[size-1].init(author, title, ID);
                        }
                break;
 
                case 2:{
                        for (int i=0;i<size; ++i)
                                book[i].show();
                }
                break;
 
                case 0:{
                        if(book!=NULL){
                                delete[] book;
                                book = NULL;
                        }
                        return 0;
                        }
                break;
                }
        }while(true);
}
добавил копиконструктор и перегрузку оператора равно. в общем то, доработанный вариант ТС.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,214
Завершенные тесты: 1
20.06.2011, 20:42     Ошибка при завершении программа. #42
Цитата Сообщение от no0ker Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
void CBook::clear(void){
        if(author!=NULL&&title!=NULL&&ID!=0)
        {
                delete[] author;
                author = NULL;
                delete[] title;
                title = NULL;
                ID = 0;
        }
}
no0ker, зачем столько ифов? Раньше и я так писал, но ведь удаление нулевого указателя это безболезненная операция

C++
1
2
3
4
5
6
7
void CBook::clear(void) {
       delete[] author;
       author = NULL;
       delete[] title;
       title = NULL;
       ID = 0;
}
ну а если без ифов религия не позволяет, то можно и так:
C++
1
2
3
4
5
6
7
8
9
void CBook::clear(void) {
    if (ID > 0) {
       delete[] author;
       author = NULL;
       delete[] title;
       title = NULL;
       ID = 0;
    }
}
Добавлено через 4 минуты
кстати, имхо, init() должна быть если не в private, то как минимум в protected.
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
20.06.2011, 20:58     Ошибка при завершении программа. #43
schdub, согласен. с условиями перебор =)
у меня init() это установка свойств объекта, ума не приложу как можно его засунуть в private. как тогда устанавливать свойства уже созданного объекта? создавать временный объект конструктором инициализации и использовать '='?

Не по теме:

интересно, что вы скажете по поводу функции addbook() =)

schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,214
Завершенные тесты: 1
20.06.2011, 22:15     Ошибка при завершении программа. #44
Цитата Сообщение от no0ker Посмотреть сообщение
у меня init() это установка свойств объекта, ума не приложу как можно его засунуть в private
по идее, установка свойств объекта должна происходить в конструкторе (!). Когда мы конструируем объект Book, то скорее всего мы уже знаем, и автора, название и id. Если все же необходимо изменить одно из полей экземпляра данного класса, то целесообразно написать соответствующие сеттеры setTitle(), setAuthor() и setId(), ксати, геттеров в интерфейсе класса я не наблюдаю

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

Не по теме:

Цитата Сообщение от no0ker Посмотреть сообщение
интересно, что вы скажете по поводу функции addbook() =)
у меня произошел Stack Overflow на строке 98 при попытке распарсить выражение CBook *&book - за почти 8 лет программирования на С++ подобную конструкцию вижу впервые . Кстати, имхо целесообразнее данный аргумент назвать books.



Добавлено через 9 минут
Но самое главный недостаток init() в том, что благодаря данной функции пользователи класса могут попасть в беду из-за утечек памяти. Например:
C++
1
2
CBook book("Unknown", "Unknown title", 999);
book.init("Author", "Title", 666); // two memory leaks HERE :)
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
21.06.2011, 16:50     Ошибка при завершении программа. #45
целесообразно написать соответствующие сеттеры setTitle(), setAuthor() и setId(), ксати, геттеров в интерфейсе класса я не наблюдаю
а если в данном примере можно вместо трех сеттеров, оставить один setAll() - у меня он называется init(). а вместо трех геттеров - оставить один - getterAll сразу с выводом на cout (у меня это функция show() )
Но самое главный недостаток init() в том, что благодаря данной функции пользователи класса могут попасть в беду из-за утечек памяти.
а если вот так?
C++
1
2
3
4
5
6
7
8
void CBook::init(char *author_, char *title_, int ID_){
        clear(); // добавим очистку
        ID = ID_;
        author = new char [strlen(author_)+1];
        strcpy(author, author_);
        title=new char [strlen(title_)+1];
        strcpy(title, title_);
}
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,214
Завершенные тесты: 1
21.06.2011, 16:54     Ошибка при завершении программа. #46
Цитата Сообщение от no0ker Посмотреть сообщение
а если вот так?
да так можно
Цитата Сообщение от no0ker Посмотреть сообщение
оставить один setAll()
а что если пользователь класса хочет изменить только ОДНО из полей класса?
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
21.06.2011, 19:57     Ошибка при завершении программа. #47
а что если пользователь класса хочет изменить только ОДНО из полей класса?
эээ... ну, по крайней мере, в данной программе точно не захочет =)

Добавлено через 2 часа 31 минуту
у меня произошел Stack Overflow на строке 98 при попытке распарсить выражение CBook *&book - за почти 8 лет программирования на С++ подобную конструкцию вижу впервые .
честно говоря, так предложил ТС.
пока работает - и трогать боюсь. =)

Добавлено через 14 минут
поиск рулит что такое *&
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2011, 23:48     Ошибка при завершении программа.
Еще ссылки по теме:

C++ Ошибка в завершении работы программы
C++ Ошибка компилятора при завершении программы
C++ Ошибка "Stack around the variable 'a' was corrupted" при завершении программы

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

Или воспользуйтесь поиском по форуму:
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,214
Завершенные тесты: 1
21.06.2011, 23:48     Ошибка при завершении программа. #48
Цитата Сообщение от no0ker Посмотреть сообщение
поиск рулит что такое *&
Спасибо, я знаю что это такое просто не использую на практике такой подход.
Yandex
Объявления
21.06.2011, 23:48     Ошибка при завершении программа.
Ответ Создать тему
Опции темы

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