Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
26 / 18 / 8
Регистрация: 08.06.2015
Сообщений: 470
1

Ошибка при удалении объекта

29.08.2019, 14:14. Показов 1046. Ответов 4
Метки нет (Все метки)

Здравствуйте,
создаю объекты класса и укладываю в массив. После энного времени объект должен удалиться. Код компилируется, но как только доходит до точки delete this выскакивает ошибка. Подскажите, что не так делаю

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
#include <cstdlib>
#include <iostream>
#include <ctime>
 
using namespace std;
int workhour = 8;
int workminute = 0;
int nexttime;
int guest = 0; // general count of guests
int sits = 20; // count of the tables
int guest_anzahl = 0;
int free_sits=sits; 
int guest_ord = 0; // ordinal number of the guest
 
class Guest{
    public:
        int hour_of_arrival; 
        int minute_of_arrival;
        string message;
        Guest() {
        hour_of_arrival = workhour;
        minute_of_arrival = workminute;
        }
        ~Guest(){
            cout << "The guest gone out" << endl;
        }
        
        void guest_first_time(int work_hour) {
        if (work_hour >= hour_of_arrival + 1){
            guest--;
            free_sits++;
            delete this; // при срабатывании этой строчки запущенный код ломается
            } 
        else {
            cout << "The guest still sits at the table" << endl;
        }
    }
    void guest_hello(string hello){
        message = hello;
    }
};
 
void show_time(){
    if (workminute < 10){
    cout << "Time: " << workhour << ":0" << workminute << endl;
}
else {
    cout << "Time: " << workhour << ":" << workminute << endl;
}
}
void time_count(int nexttime){ // count of time
    workminute += nexttime;
    workhour += workminute/60;
    if (workminute >=60)    workminute = workminute%60;
    }
int guest_anzahl_random(){ // random count of guests
    int gue_max = 4;
    int gue_min = 0;
    int gue_max_primetime = 12;
    int guest_anzahl;
    if (((workhour >= 13)&&(workhour <= 14))||((workhour >= 18)&&(workhour <= 20))){
        guest_anzahl = rand()%(gue_max_primetime+gue_min);
    }
    else guest_anzahl = rand()%(gue_max+gue_min);
    return guest_anzahl;
} 
 
int main(int argc, char** argv) {
srand(time(0));
Guest guest_arr[30];
 
while (workhour < 24){
    
    
    if ((free_sits > 0)&&(workhour >= 12)){
        guest_anzahl = guest_anzahl_random();
        guest += guest_anzahl;
        free_sits = sits - guest;
        
        for (int i=0; i < guest_anzahl; i++){
                //new_guest();
                Guest a1 = new Guest();
                guest_arr[guest_ord] = a1;
                guest_arr[guest_ord].guest_hello("Hi");
                cout << "The new guest say " << guest_arr[guest_ord].message << endl;
                guest_ord++;
                cout << "The guest " << guest_ord << " has " << guest_arr[guest_ord].money << " euro" << endl;
        }
        
    cout << "There are " << free_sits << " free sits from " << sits << " sits" << endl;
    }
    else if (workhour < 12) cout << "The guests come after 12:00" << endl;
    else {
            cout << "There are no more sits" << endl;
            
        }
    
    show_time();
    
    for (int i = 0; i < sizeof(guest_arr); i++){
        if (guest_arr[i].message != "Hi"){ // if the cells of array are already empty, the for should be broken
            break;
        }
        else {
        
        int nextGuest; 
        cout << " Guest " << i+1 << " came at " << guest_arr[i].hour_of_arrival << ":" << guest_arr[i].minute_of_arrival << endl;
        guest_arr[i].guest_first_time(workhour);
        cin >> nextGuest;
        }
    }
    cout << "How many minutes do you want to miss? " << endl;
    cin >> nexttime;
    time_count(nexttime);
    
}
 
cout << "The day is over. It's time to sleep!";
 
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2019, 14:14
Ответы с готовыми решениями:

Требуется ли при удалении объекта посредством delete указывать тип объекта?
например, есть указателиvoid *p1; void *p2; есть VCL-объект TButton, есть самописный класс...

Ошибка при удалении массива
Программа работает нормально, но в конце при удалении выдает ошибку &quot;Invalid address specified to...

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

Ошибка при удалении класса
Доброго времени суток! Есть класс: class Sector { public: Sector(); ~Sector(); private:...

4
277 / 154 / 52
Регистрация: 30.06.2011
Сообщений: 1,703
29.08.2019, 14:42 2
Наверное потому, что Вы создаете массив объектов класса на стеке Guest guest_arr[30], а удалять пытаетесь как будто создали в куче delete this.
1
26 / 18 / 8
Регистрация: 08.06.2015
Сообщений: 470
29.08.2019, 14:50  [ТС] 3
C++
1
2
Guest a1 = new Guest;
        guest_arr[guest_ord] = a1;
я думал, что в куче((
Но если удалить элемент массива, объект же все равно останется
0
9 / 7 / 2
Регистрация: 13.11.2014
Сообщений: 51
29.08.2019, 15:53 4
Лучший ответ Сообщение было отмечено Сергей Кос как решение

Решение

Цитата Сообщение от Сергей Кос Посмотреть сообщение
Подскажите, что не так делаю
Во-первых, он не скомпилируется по двум причинам:

1)
C++
1
Guest a1 = new Guest();
Верный вариант:
C++
1
2
Guest* a1 = new Guest();
guest_arr[guest_ord] = *a1;
Если стоит new, то слева полюбому указатель (*), вы объекту Guest пытаетесь присвоить указатель Guest*.

2) Не вижу определения поля "money" у класса Guest

C++
1
" << guest_arr[guest_ord].money << "
Теперь по вопросу:

как и сообщил коллега вверху, при delete this вы удаляете объект класса Guest, который хранится в массиве guest_arr, который находится в стеке (Guest guest_arr[30].

C++
1
2
                Guest* a1 = new Guest();
                guest_arr[guest_ord] = *a1;
Вы понимаете,что тут происходит? Думаю нет, я поясню. Выделяете в куче память под объект Guest - a1. Затем через оператор присваивания (=) запихиваете все поля из a1 в guest_arr[guest_ord]. a1 у вас благополучно теряется (утечка), так как нету нигде delete a1. Именно его нужно УДАЛЯТЬ! И потом в цикле for вы вызываете:

C++
1
guest_arr[i].guest_first_time(workhour);
- насколько я понял, что если гость протусил в кафешке час и более, мы его выгоняем и вызываем delete this. А удаляется то в стеке!

Исходя из всего этого я предполагаю, что вы слабы ещё в понимании указателей и распределения памяти. Книги Страуструпа вам в помощь =)

По этой задаче конкретно, если уж вам прям так хочется использовать стековый массив из 30 элементов, то в случае, если гость "протусил" больше положенного, то снаружи делать проверки на время, ничего не удалять из памяти, а просто управлять счётчиком guest_ord( чего вы не делаете кстати) и совершать операции удаления из массива. Удаление из массива дорогостоящая операция, для этих целей отлично подходит контейнер list (список), но это другая история!
1
26 / 18 / 8
Регистрация: 08.06.2015
Сообщений: 470
26.12.2019, 14:03  [ТС] 5
Цитата Сообщение от born4bits Посмотреть сообщение
гость протусил в кафешке час и более
это не кафешка, это ресторан
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2019, 14:03

Ошибка при удалении динамических массивов
#include &lt;iostream&gt; int main() { setlocale(LC_ALL, &quot;rus&quot;); int m, a, c, x0, x_minus, size =...

Ошибка при удалении данных из программы
Столкнулся с такой проблемой (смотри скриншот). До добавления очистки указатель и динамических...

Ошибка при удалении динамического массива
Непонятная мне ошибка при удалении массива #include &lt;iostream&gt; #include &lt;conio.h&gt; using...

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


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

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

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