Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 1
Регистрация: 30.10.2017
Сообщений: 34
1

Дин. память, завершение программы

28.02.2018, 17:56. Показов 1095. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Проблема заключается в том, что когда уже происходит завершение программы, то забрасывает в файл дизассемблера указывая на строку с: "775ACBF2 int 3".
А после продолжения (f5) выбрасывает ошибка СrtIsValidHeapPointer(Block).
Знал бы как добавлять файлы, скинул бы скрин окна проблемы.

Код программы:

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

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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
// файл CMachine.h
 
#pragma once
 
#include <iostream>
 
using namespace std;
 
class CMachine
{
private:
    enum Fuel{Electro, Diesel, Petrol};
 
protected:
    Fuel m_uiEngine;
    int m_unValue;
    int * m_unweight = new int;  // Выделил память для переменной (1)
 
public:
 
    CMachine();
    CMachine(const CMachine& other);
    virtual ~CMachine();
    
    CMachine& operator= (const CMachine& other);
    
    virtual int ValueOfCountMachines(int n) = 0;
    virtual int weightOfCountMachines(int n) = 0;
 
    void SetM();
    void GetM();
};
 
// файл CMachine.cpp
 
#include "CMachine.h"
 
CMachine::CMachine()
{
    m_uiEngine = Electro;
    m_unValue = 0;
    *m_unweight = 0;  // присвоил дин. переменной (1) значение
}
 
CMachine::CMachine(const CMachine& other)
{
    this->m_uiEngine = other.m_uiEngine;
    this->m_unValue = other.m_unValue;
    *this->m_unweight = *other.m_unweight; // может в этом проблема? как-то не эстетично
}
 
CMachine::~CMachine()
{
    if (m_unweight != 0)
    {
        delete m_unweight;        //деструктор удаляет память
        m_unweight = nullptr;
    }
}
 
CMachine& CMachine::operator= (const CMachine& other)
{
 
    this->m_uiEngine = other.m_uiEngine;
    this->m_unValue = other.m_unValue;
    *this->m_unweight = *other.m_unweight;   // получается что идентично конструктору копирования
 
    return *this;
}
 
void CMachine::SetM()
{
    int m_uiEngine;
    cout << "Enter, please powered by Electricity, Diesel or Petrol (1, 2, 3): ";
    cin >> m_uiEngine;
    m_uiEngine--; 
    cout << endl;
 
    int m_unValue;
    cout << "Enter, please the price of this machine: ";
    cin >> m_unValue;
    cout << endl;
 
    int * m_unweight = new int;
    cout << "Enter, please the weight of this machine: ";
    cin >> *m_unweight;
    cout << endl;
 
    this->m_uiEngine = (Fuel)m_uiEngine;
    this->m_unValue = m_unValue;
 
    *this->m_unweight = *m_unweight;         // можно наверное было просто cin >> *this->переменная
    delete m_unweight;                                  // но и да Бог с простым вариантом
    m_unweight = nullptr;
}
 
void CMachine::GetM()
{
    cout << "Type of fuel is: ";
    switch (m_uiEngine)
    {
    case 0:
        cout << "electricity.";
        break;
    case 1:
        cout << "diesel fuel.";
        break;
    case 2:
        cout << "petrol fuel.";
    }
    cout << endl;
 
    cout << "The price of this machine is: " << m_unValue << "." << endl;
 
    cout << "The weight of this machine is: " << *m_unweight << "." << endl;
}
 
// файл CArmoredCar.h
 
#pragma once
 
#include "CMachine.h"
 
class CArmoredCar : public CMachine
{
protected:
    int m_unThickOfArmor;
    int m_unMaxSpeed;
    int * m_unEngineLiters = new int;       // выделяю вторую дин. переменную (2)
 
public:
    CArmoredCar();
    CArmoredCar(const CArmoredCar& other);
    ~CArmoredCar();
 
    int ValueOfCountMachines(int n) override;
    int weightOfCountMachines(int n) override;
 
    void SetA();
    void GetA();
};
 
// файл CArmoredCar.cpp
 
#include "CArmoredCar.h"
 
CArmoredCar::CArmoredCar()
{
    m_unThickOfArmor = 0;
    m_unMaxSpeed = 0;
    *m_unEngineLiters = 0;  // присваиваю 0 дин переменной (2)
}
 
CArmoredCar::CArmoredCar(const CArmoredCar& other)
{
    this->m_unThickOfArmor = other.m_unThickOfArmor;
    this->m_unMaxSpeed = other.m_unMaxSpeed;
    *this->m_unEngineLiters = *other.m_unEngineLiters;  // идентично как и у базовом класе
}
 
CArmoredCar::~CArmoredCar()
{
    if (m_unEngineLiters != 0)
    {
        delete m_unEngineLiters;      // тоже самое, может проблема в virtual ~деструкторе
        m_unEngineLiters = nullptr;
    }
}
 
int CArmoredCar::ValueOfCountMachines(int n)
{
    return (m_unValue * n);
}
 
int CArmoredCar::weightOfCountMachines(int n)
{
    return ((*m_unweight) * n);   //здесь вроде все нормально работает и выводит 
}
 
void CArmoredCar::SetA()
{
    int m_unThickOfArmor;
    cout << "Enter, please the thick of armor: ";
    cin >> m_unThickOfArmor;
    cout << endl;
 
    int m_unMaxSpeed;
    cout << "Enter, please max speed: ";
    cin >> m_unMaxSpeed;
    cout << endl;
 
    int * m_unEngineLiters = new int;
    cout << "Enter, please the count of Engine liters: ";
    cin >> *m_unEngineLiters;
    cout << endl;
 
    this->m_unThickOfArmor = m_unThickOfArmor;
    this->m_unMaxSpeed = m_unMaxSpeed;
 
    *this->m_unEngineLiters = *m_unEngineLiters;    //тоже самое
    delete m_unEngineLiters;
    m_unEngineLiters = nullptr; 
}
 
void CArmoredCar::GetA()    
{
    cout << "The thick of the armor is:  " << m_unThickOfArmor << endl;
    cout << "Max speed of this armored machine is: " << m_unMaxSpeed << endl;
    cout << "The count of Engine liters is: " << *m_unEngineLiters << endl;
}
 
// файл main.cpp
 
#include "CMachine.h"
#include "CArmoredCar.h"
 
void main()
{
    CArmoredCar ArmoredCar1;
    ArmoredCar1.GetM();
    ArmoredCar1.GetA();
 
    ArmoredCar1.SetM();
    ArmoredCar1.SetA();
 
    cout << "value of 5 machines: " << ArmoredCar1.ValueOfCountMachines(3) << endl;
    cout << "weight of 5 machines: " << ArmoredCar1.weightOfCountMachines(3) << endl << endl;
 
    CArmoredCar ArmoredCar2 = ArmoredCar1;
    CArmoredCar ArmoredCar3;
    
    ArmoredCar2 = ArmoredCar3;
 
    system("pause");
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.02.2018, 17:56
Ответы с готовыми решениями:

Дин. память и таблица NxN
Дана целочисленная таблица NxN, определить номер столбца с минимальным числом четных чисел. Свой...

Программа через дин.память
Нужно сделать через динамическую память . У меня есть два массива . Нужно найти максимальное...

Внешний файл и дин.память
Задачу надо сделать через файл и дин.память. Данные с файла считывает, но вот результат не...

завершение программы
помогите сообразить #include &lt;StdAfx.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

4
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
28.02.2018, 19:11 2
В конструкторе копирования нужно выделять память.
0
1 / 1 / 1
Регистрация: 30.10.2017
Сообщений: 34
01.03.2018, 01:12  [ТС] 3
Цитата Сообщение от nd2 Посмотреть сообщение
В конструкторе копирования нужно выделять память.
Простите, в каком смысле?
Память у меня для дин. переменных выделяется сразу при их объявлении в файле .h
В конструкторе копирования, я принимаю константный объект другого класса (что значит не могу изменять его) и переприсваиваю поочерёдно все переменные.
С динамической переменной делаю то же самое, не трогая ни память ни указатели, а просто копирую значение в текущий класс. Соответственно предполагая, что деструктор по шаблону автоматически будет вызываться и для этого объекта и для другого, ну это понятно. Но всё же ошибка существует.
Конечно, я попробовал, как вы сказали выделить память ещё и в конструкторе копирования, для дин. переменной, но ничего не изменилось.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
01.03.2018, 02:05 4
Лучший ответ Сообщение было отмечено _Sora_ как решение

Решение

В CArmoredCar почему оператора присваивания нет?

Добавлено через 12 минут
Если сделать, то вылетов нет.
1
1 / 1 / 1
Регистрация: 30.10.2017
Сообщений: 34
01.03.2018, 11:00  [ТС] 5
Цитата Сообщение от nd2 Посмотреть сообщение
В CArmoredCar почему оператора присваивания нет?
Добавлено через 12 минут
Если сделать, то вылетов нет.
Хех, сам вчера уже нашел, но забыл сюда написать)
Но всё равно спасибо)
0
01.03.2018, 11:00
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.03.2018, 11:00
Помогаю со студенческими работами здесь

Завершение программы
Как завершить программу из другой функции(не Main)? Пробовал использовать system(&quot;exit&quot;);, но не...

Неожиданное завершение программы
простенькая программа, нужно ввести двумерный массив, после чего во втором массиве написать в iый...

Принудительное завершение программы
#include &lt;iostream&gt; using namespace std; int main() { setlocale (0,&quot;&quot;); int N; cout &lt;&lt;...

Принудительное завершение программы
for (int i = 0; i &lt; 20; i++) for (int j = 0; j &lt; 20; j++) for (int n= 0; n &lt; 20; n++) { ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru