Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 05.12.2014
Сообщений: 12

Неправильная работа деструктора

05.12.2014, 10:25. Показов 1499. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При выполнении деструктора вылетает ошибка


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
//Врачебный контроль физиологического состояния спортсмена
#include <iostream>
 
using namespace std;
 
class Patient{
private:
    int age; //Возраст
    float grows, weight, temp; //Рост, вес, температура
    char *build; //Телосложение (thin, medium-build, fat)
    char *sow; // Сильный или слабый (strong, weak)
    //-----------------------------------------------------------------
public:
    Patient(int a, float g, float w, float t, char *b, char *s); //Конструктор
    Patient(); //Конструктор по-умолчанию
    Patient(const Patient &p); //Копирующий конструктор
    ~Patient(); //Деструктор
    void printParams() const; //Вывод всех параметров пациента ок
    void copy(const Patient &p); //Копирование пациента ок
    char* searchParam(char *paramname); //Возврат отдельного параметра ок
    bool comparison(const Patient &p); //Сравнение параметров пациентов 
    void Edit(); //Редактирование
};
 
Patient::Patient(const Patient &p){
    build = new char(strlen(p.build) + 1);
    sow = new char(strlen(p.sow) + 1);
 
    age = p.age;
    grows = p.grows;
    weight = p.weight;
    temp = p.temp;
    strcpy(build, p.build);
    strcpy(sow, p.sow);
}
 
Patient::~Patient(){
    delete [] build;
    delete [] sow;
}
 
Patient::Patient(int a, float g, float w, float t, char *b, char *s){
    sow = new char[strlen(s) + 1];
    build = new char[strlen(b) + 1];
    age = a;
    grows = g;
    weight = w;
    temp = t;
    build = b;
    sow = s;
}
 
Patient::Patient(){
    sow = "strong";
    build = "fat";
    age = 21;
    grows = 1.90;
    weight = 90;
    temp = 36.6;
}
 
void Patient::printParams() const{
    cout << "Возраст: " << age << endl <<
        "Рост: " << grows << endl <<
        "Вес: " << weight << endl <<
        "Температура: " << temp << endl <<
        "Телосложение: " << build << endl <<
        "Сила: " << sow << endl;
}
 
void Patient::copy(const Patient &p){
    age = p.age;
    grows = p.grows;
    weight = p.weight;
    temp = p.temp;
    build = p.build;
    sow = p.sow;
}
 
char* Patient::searchParam(char *paramname){
    char buff[10];
    if (paramname == "age"){
        itoa(age, buff, 10);
        return buff;
    }
    else if (paramname == "grows"){
        sprintf(buff, "%f", grows);
        return buff;
    }
    else if (paramname == "weight"){
        sprintf(buff, "%f", weight);
        return buff;
    }
    else if (paramname == "temp"){
        sprintf(buff, "%f", temp);
        return buff;
    }
    else if (paramname == "build"){
        return build;
    }
    else if (paramname == "sow"){
        return sow;
    }
}
 
bool Patient::comparison(const Patient &p){
    if ((age == p.age) && (grows == p.grows) && (weight == p.weight) && (temp == p.temp) && (build == p.build) && (sow == p.sow))
        return true;
    else
        return false;
}
 
void Patient::Edit(){
    int age1;
    float grows1, weight1, temp1;
    char *build1 = new char[];
    char *sow1 = new char[];
    cout << "Введите новые параметры пациента: " << endl;
    cout << "Возраст: "; cin >> age1;
    cout << "Рост: "; cin >> grows1;
    cout << "Вес: "; cin >> weight1;
    cout << "Температура: "; cin >> temp1;
    cout << "Телосложение: "; cin >> build1;
    cout << "Сила: "; cin >> sow1;
    Patient(age1, grows1, weight1, temp1, build1, sow1);
    cout << "Данные успешно изменены." << endl;
}
 
void main(){
    setlocale(LC_ALL, "Russian");
    Patient *patient1 = new Patient(1, 21, 3, 4, "build", "sow");
    Patient *patient2 = new Patient(*patient1);
 
    //Проверка. Вывод данных 1го пациента
    cout << "Данные для 1го пациента" << endl;
    patient2->printParams();
    
    delete patient1;
    delete patient2;
 
    system("pause");
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.12.2014, 10:25
Ответы с готовыми решениями:

Работа деструктора
Доброго дня, уважаемые программисты! Лаба. Есть класс Дата_и_Время, в классе часть полей должна быть динамическими. class...

Неправильная работа
Почему на неправильно работает? #include&lt;iostream&gt; using namespace std; int main() { int b; for (int i=0; i&lt;=14;...

Неправильная работа цикла
Есть два цикла: while (infile){ infile &gt;&gt; dist1; cout &lt;&lt; dist1 &lt;&lt; endl; } while (1){ infile &gt;&gt; dist1; ...

3
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.12.2014, 10:27
Нельзя константы присваивать как в строках 54-55. Память должна динамически выделяться и потом уже туда что-то копироваться.
Сравнения как в строке 82 тоже не верны. Ты со string не перепутал?
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,218
05.12.2014, 10:39
Лучший ответ Сообщение было отмечено aiduryagin как решение

Решение

В конструкторе копирования написано вот такое

Цитата Сообщение от aiduryagin Посмотреть сообщение
C++
1
build = new char(strlen(p.build) + 1);
В языке С++ выделение памяти под массив делается через оператор 'new[]'. С квадратными скобками

C++
1
build = new char[strlen(p.build) + 1];
А то, что у вас понаписано выделяет один-единственный символ. Неудивительно, что присходит выход за пределы выделенной памяти с вышеописанными последствиями.

При этом в следующем конструкторе вдруг используются правильные квадратные скобки. Что это за мешанина разных скобок?

Но во этом следующем конструкторе вы вдруг забываете про использование 'strcpy' (про которое помнили в первом конструкторе) и начинаете делать вот такую белиберду

C++
1
2
build = b;
sow = s;
Что случилось? Почему в первом случае вы правильно использовали 'strcpy', а здесь вдруг про 'strcpy' напрочь забыли? Это что, два разных человека писало?

В третьем конструкторе (по умолчанию) вы вообще перестали выделять память, а смело ставите указатели прямо на строковые литералы

C++
1
2
3
Patient::Patient(){
    sow = "strong";
    build = "fat";
Это что, третий человек писал?

Зачем вдруг понадобилась функция 'copy'? По уму она должна быть реализована как оператор присваивания, но на самом деле ведет себя как плохо реализованный конструктор копирования. Зачем эта функция вообще нужна, когда правильнее было бы реализовать нормальный оператор присваивания?
1
0 / 0 / 0
Регистрация: 05.12.2014
Сообщений: 12
05.12.2014, 17:36  [ТС]
Вообще, это просто лабораторная работа, отсюда и куча ненужных плохо написанных функций. Со скобками вышло случайно (писал прямо перед лабой). Спасибо за советы. Все исправил. Все отлично работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.12.2014, 17:36
Помогаю со студенческими работами здесь

Неправильная работа с файлами
#include &lt;iostream.h&gt; #include &lt;fstream.h&gt; #include &lt;windows.h&gt; #include &lt;string&gt; struct student { char name; char...

Неправильная работа исключений
Сделал в программе исключения, если пользователь направльно ввводит значения: // englerr.cpp // контроль ввода данных для класса...

Неправильная работа кода
я уже обращалась с этим вопросом. у меня код написан без ошибок. работать он должен: я задаю ему номер задачи, а он должен выдавать...

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

Неправильная работа scanf_s
Ув. программисты, Есть такой код: #include &lt;stdio.h&gt; #include &lt;iostream&gt; int main() { char name;


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru