Форум программистов, компьютерный форум 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++ Ошибка при завершении программа.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silentnuke
Android Programmer
137 / 138 / 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, следовательно не нужно делать лишние операции копирования.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
18.06.2011, 22:48     Ошибка при завершении программа. #22
нет там перегрузки
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
18.06.2011, 22:48     Ошибка при завершении программа. #23
silentnuke,
3. Перебрасываю указатель book на выделенную память temp.
а до переброски он указывал на другую часть выделенной памяти(А). после переброски, на (А) указателей не остается. это разве не утечка памяти получается?
DigsiL
9 / 9 / 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];
    }
}
Код сработал правильно как и в первом случае.
как понимаю в первом случае происходит побитовое копирование
а во втором тоже ???
silentnuke
Android Programmer
137 / 138 / 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];
    }
}
Код сработал правильно как и в первом случае.
как понимаю в первом случае происходит побитовое копирование
а во втором тоже ???
да , я же описал в чем преимущество моего способа.
no0ker
100 / 87 / 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 книг) какой указатель смотрит?
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 22:55     Ошибка при завершении программа. #27
Цитата Сообщение от no0ker Посмотреть сообщение
silentnuke,
а до пункта 3. - book смотрел на область памяти, где висело 10 000 книг. а после переброски на новую область (выделили под 10 001 книг), на старую область памяти (где 10 000 книг) какой указатель смотрит?
Ну поскольку произвели побитовое копирование удалять ту память точно не стоит, т.к. удалятся все 10000 книг, щас напишу все-таки перегрузку равно, чтобы больше не возникло вопросов.
DigsiL
9 / 9 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 22:57  [ТС]     Ошибка при завершении программа. #28
Блин как все запутано когда учили структуру таких проблем не было.
Все же как мне кажется нужна удалить temp после копирование в book
pito211
 Аватар для 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 в другой участок памяти. Смысл?
no0ker
100 / 87 / 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 осталась "висячей". утечка памяти.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
18.06.2011, 22:59     Ошибка при завершении программа. #31
между 7 и 8 строкой надо добавить delete[] book;
DigsiL
9 / 9 / 1
Регистрация: 14.01.2011
Сообщений: 113
18.06.2011, 23:02  [ТС]     Ошибка при завершении программа. #32
Цитата Сообщение от pito211 Посмотреть сообщение
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 в другой участок памяти. Смысл?
Я с тобой полностью согласен покажи как правильно сделать вот мой код
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
#include <iostream>
#include <Windows.h>
 
using namespace std;
class CBook
{
public:
    CBook(void);
    void Input(char *author1,char *title1,int ID1);
    void Show ();
    ~CBook(void);
private:
    int ID;
    char *author;
    char *title;
};
CBook::CBook(void)
{
        author=NULL;
        title=NULL;
        ID=NULL;
}
 
void CBook::Input(char *author1,char *title1,int ID1)
{
    ID=ID1;
    author=new char [strlen(author1)+1];
    strcpy(author,author1);
    title=new char [strlen(title1)+1];
    strcpy(title,title1);
 
}
void CBook::Show()
{
    cout<<"ID:"<<ID<<endl;
    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=temp;
 
 
}
void main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    char author[20];
    char title[20];
    int ID=0;
    int key=0;
    int size=0;
    CBook *book;
    do
    {
        cout<<"1.Добавить книгу"<<endl;
        cout<<"2.Вывести книги"<<endl;
        cout<<"0.Выход"<<endl;
        cin>>key;
        switch (key)
        {
        case 1:
            {
                ID+=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,ID);
            }break;
        case 2:
            {
                for (int i=0;i<size;i++)
                {
                    book[i].Show();
                }
            }break;
        case 0:
            {
                delete []book;
                return;
            }break;
        }
    }while(key);
}
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 23:02     Ошибка при завершении программа. #33
Цитата Сообщение от pito211 Посмотреть сообщение
между 7 и 8 строкой надо добавить delete[] book;
ноу проблем, добавляйте.)
и протейстируйте, могу заранее сказать что потеряете весь список книг.)
т.к. произошло побитовое копирование полей.
тобишь title, author книг смотрят в тоже метсо где они и были раньше.
По поводу нет смысла. Это как нету, выделялелась память под новую книг+скопировались все старые.
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
18.06.2011, 23:04     Ошибка при завершении программа. #34
silentnuke,
тобишь title, author книг смотрят в тоже метсо где они и были раньше.
и вот тут на сцену выходит адекватное переопределение оператора "="...
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 23:07     Ошибка при завершении программа. #35
Цитата Сообщение от no0ker Посмотреть сообщение
silentnuke,
и вот тут на сцену выходит адекватное переопределение оператора "="...
я же давно сказал, мне лень его было писать. про адекватное переопределение оператора "=", знал изначально, но в данной ситуации можно обойтись и без него.
В данной ситуации утечки нету, ведь все эти поля удалятся при case 0)
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
18.06.2011, 23:10     Ошибка при завершении программа. #36
дык список и без delete потеряется, но это уже другой вопрос. Я обратил внимание на утечку памяти.
Вообще её обсуждать смысла нет, потому чт она сделана через жопу - в любой момент времени в массиве хранится только одна книга(последняя введённая) и куча неинициализированных
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 23:14     Ошибка при завершении программа. #37
Цитата Сообщение от pito211 Посмотреть сообщение
дык список и без delete потеряется, но это уже другой вопрос. Я обратил внимание на утечку памяти.
Вообще её обсуждать смысла нет, потому чт она сделана через жопу - в любой момент времени в массиве хранится только одна книга(последняя введённая) и куча неинициализированных
хотя да, вы правы. всеравно надо писать конструктор копирование, и перегружать оператор "=" )
no0ker
18.06.2011, 23:14
  #38

Не по теме:

silentnuke,

В данной ситуации утечки нету, ведь все эти поля удалятся при case 0)
вы имеете в виду, что ОС подчищает "хвосты"? потому что, в программе остаются участки памяти без направленных на них указателей, и удалить их не представляется возможным.
согласен, что утечка памяти, на работоспособность _данной_ программы влияет мало, но это не причина не бороться с ней.

silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
18.06.2011, 23:20     Ошибка при завершении программа. #39
Цитата Сообщение от no0ker Посмотреть сообщение

Не по теме:

silentnuke,
вы имеете в виду, что ОС подчищает "хвосты"? потому что, в программе остаются участки памяти без направленных на них указателей, и удалить их не представляется возможным.
согласен, что утечка памяти, на работоспособность _данной_ программы влияет мало, но это не причина не бороться с ней.

нет я имел ввиду кое-что другое. щас все-таки скину версию с копиконструктором и перегруженным равно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2011, 23:26     Ошибка при завершении программа.
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
18.06.2011, 23:26     Ошибка при завершении программа. #40
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
#include "stdafx.h"
#include <iostream>
#include <stdexcept>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <string>
 
#include <iostream>
//#include <Windows.h>
 
using namespace std;
class CBook
{
public:
        CBook();
        CBook(const CBook& another);
        CBook(const string& _author, const string& _title1, const int& _ID);
 
        void Show ();
        ~CBook();
private:
        int ID;
        string author;
        string title;
};
CBook::CBook() : author(""), title(""), ID(0)
{
        
}
 
CBook::CBook(const CBook& another) : author(another.author), title(another.title), ID(another.ID)
{
        
}
 
CBook::CBook(const string& _author, const string& _title, const int& _ID) : author(_author), title(_title), ID(_ID)
{
        
}
 
 
 
void CBook::Show()
{
        cout<<"ID:"<<ID<<endl;
        cout<<"Автор:"<<author<<endl;
        cout<<"Название книги:"<<title<<endl;
}
 
CBook::~CBook(void)
{
 
}
 
 
void main()
{
        //SetConsoleOutputCP(1251);
        //SetConsoleCP(1251);
        string author;
        string title;
        int ID=0;
        int key=0;
        int size=0;
        vector<CBook> book;
        do
        {
                cout<<"1.Добавить книгу"<<endl;
                cout<<"2.Вывести книги"<<endl;
                cout<<"0.Выход"<<endl;
                cin>>key;
                switch (key)
                {
                case 1:
                        {
                                ID+=1;
                                cin.ignore();
                                cout<<"Введите Автора:";
                                cin >> author;
                                cout<<"Введите название книги:";
                                cin >> title;
                                
                                book.push_back(CBook(author, title, ID));
                        }break;
                case 2:
                        {
                            for (int i=0;i<book.size();i++)
                                {
                                        book[i].Show();
                                }
                        }break;
                case 0:
                        {
 
                                return;
                        }break;
                }
        }while(key);
}
Добавлено через 3 минуты
в с++ можно прекрасно обойтись без указателей и тем более тормозных сишных строк. Они нужны только в низкоуровневых представлениях. Есть string, vector, auto_ptr пользуйся ими! Хотя тебе безусловно полезно было бы потренироваться с указателями, потому что ты ни хрена не понимаешь чё делаешь судя по коду
Yandex
Объявления
18.06.2011, 23:26     Ошибка при завершении программа.
Ответ Создать тему
Опции темы

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