С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

47
no0ker
18.06.2011, 22:36     Ошибка при завершении программа.
  #16

Не по теме:

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

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

Не по теме:

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

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

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

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

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

Не по теме:

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

0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 22:46 #21
Цитата Сообщение от DigsiL Посмотреть сообщение
Хм мы еще не проходили толком конструктор копирование

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


Но все так как я сделал должно быть правильней чем как у Вас вить действительность память надо для book выделить и перекопировать а потом temp уничтожить.
Как я понимаю ))
Бреед. Возьмем ситуацию, у вас уже есть 10000 книг, вы добавляете ещё одну:
что произойдет в способе реализованном вами?
1. выделится память под temp на 10001 книг.
2. копируются предыдущие 10000 книг
3. выделится память для book на 10001 книг
4. снова копируется 10000 книг.

что произойдет у меня?
1. выделится память под temp на 10001 книг.
2. скопируются педыдущие 10000 книг
3. book станет смотреть на память temp, следовательно не нужно делать лишние операции копирования.
1
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
18.06.2011, 22:48 #22
нет там перегрузки
0
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
18.06.2011, 22:48 #23
silentnuke,
3. Перебрасываю указатель book на выделенную память temp.
а до переброски он указывал на другую часть выделенной памяти(А). после переброски, на (А) указателей не остается. это разве не утечка памяти получается?
1
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 22:49  [ТС] #24
Цитата Сообщение от silentnuke Посмотреть сообщение
стоп стоп.
идем по пунктам:
1. очищать не надо, т.к. было произведено побитовое копирование полей.
2. Давайте называть вещи своими именами? Конструктор копирования вызывается все в 3х случаях:
• Срабатывает через инициализацию другим объектом.
• Срабатывает при передаче в функцию
• При возврате из функции
А то что приведено в вашем коде, называется перегрузкой операторов. Можно перегрузить оператор равно, но у меня лично не было желания. в данном примере можно обойтись как раз побитовым копированием полей.
Сейчас переписал функцию
C++
1
2
3
4
5
6
7
8
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=0;i<size;i++)
    {
        book[i]=temp[i];
    }
}
Код сработал правильно как и в первом случае.
как понимаю в первом случае происходит побитовое копирование
а во втором тоже ???
0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 22:50 #25
Цитата Сообщение от no0ker Посмотреть сообщение
silentnuke,

а до переброски он указывал на другую часть выделенной памяти(А). после переброски, на (А) указателей не остается. это разве не утечка памяти получается?
мы же произвели побитовое копирование, забыли?)

Добавлено через 57 секунд
Цитата Сообщение от DigsiL Посмотреть сообщение
Сейчас переписал функцию
C++
1
2
3
4
5
6
7
8
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=0;i<size;i++)
    {
        book[i]=temp[i];
    }
}
Код сработал правильно как и в первом случае.
как понимаю в первом случае происходит побитовое копирование
а во втором тоже ???
да , я же описал в чем преимущество моего способа.
1
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
18.06.2011, 22:52 #26
silentnuke,
1. выделится память под temp на 10001 книг.
2. скопируются педыдущие 10000 книг
3. book станет смотреть на память temp, следовательно не нужно делать лишние операции копирования.
а до пункта 3. - book смотрел на область памяти, где висело 10 000 книг. а после переброски на новую область (выделили под 10 001 книг), на старую область памяти (где 10 000 книг) какой указатель смотрит?
1
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 22:55 #27
Цитата Сообщение от no0ker Посмотреть сообщение
silentnuke,
а до пункта 3. - book смотрел на область памяти, где висело 10 000 книг. а после переброски на новую область (выделили под 10 001 книг), на старую область памяти (где 10 000 книг) какой указатель смотрит?
Ну поскольку произвели побитовое копирование удалять ту память точно не стоит, т.к. удалятся все 10000 книг, щас напишу все-таки перегрузку равно, чтобы больше не возникло вопросов.
1
DigsiL
10 / 10 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 22:57  [ТС] #28
Блин как все запутано когда учили структуру таких проблем не было.
Все же как мне кажется нужна удалить temp после копирование в book
0
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
18.06.2011, 22:58 #29
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) Утечка памяти
2) Функция вообще ничего не делает, точнее передислоцирует book в другой участок памяти. Смысл?
1
no0ker
101 / 88 / 4
Регистрация: 17.12.2010
Сообщений: 416
18.06.2011, 22:59 #30
silentnuke,
Ну поскольку произвели побитовое копирование удалять ту память точно не стоит, т.к. удалятся все 10000 книг, щас напишу все-таки перегрузку равно, чтобы больше не возникло вопросов.
я считаю, что после побитового копирования полей, удалять старую память просто необходимо.
было -
указатель 1 - на 10 000 книг.
и область памяти 1 - на 10 000 книг.
сделали -
указатель 2 - на 10 0001 книг.
и область памяти 2 - на 10 0001 книг.
указатель 1 просто направили на область памяти 2.
а область памяти 1 осталась "висячей". утечка памяти.
1
18.06.2011, 22:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2011, 22:59
Привет! Вот еще темы с ответами:

Ошибка в завершении работы программы - 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;); ...

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

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

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


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

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

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