При добавлении нового элемента в массив структур, сохраняется мусор
#include <iostream>
using namespace std;
struct armament
{
// экипировка
int count_of_body_armor; // количество бронежилетов
int count_of_helmets; // количество касок
int count_of_thermal_imagers; // количество тепловизоров
int count_of_aid; // количество аптечек
// танки
char type_of_tank[50]; // тип танка
char name_of_tank[30]; // название танка
int count_of_tanks; // количество танков
float caliber_of_tanks; // калибр орудия
// атрилерия
char type_of_artillery[50]; // тип артиллерии
char name_of_artillery[30]; // название артиллерии
int count_of_artillery; // количество артиллерии
float caliber_of_artillery; // калибр орудия
};
void AddElement(armament company[], int& SIZE); // добавление элемента массива
void ShowCompany(armament company[], int& SIZE); // вывод массива
int main()
{
int SIZE = 3;
armament* company = new armament[SIZE];
// 1 рота ----------------------------------
// экипировка
company[0].count_of_body_armor = 200;
company[0].count_of_helmets = 250;
company[0].count_of_thermal_imagers = 250;
company[0].count_of_aid = 400;
// танки
strcpy_s(company[0].type_of_tank, "Medium tank");
strcpy_s(company[0].name_of_tank, "M 60 modernized");
company[0].count_of_tanks = 60;
company[0].caliber_of_tanks = 45;
// атрилерия
strcpy_s(company[0].type_of_artillery, "Rocket artillery");
strcpy_s(company[0].name_of_artillery, "M142 HIMARS");
company[0].count_of_artillery = 40;
company[0].caliber_of_artillery = 227;
// 2 рота ----------------------------------
// экипировка
company[1].count_of_body_armor = 320;
company[1].count_of_helmets = 360;
company[1].count_of_thermal_imagers = 400;
company[1].count_of_aid = 440;
// танки
strcpy_s(company[1].type_of_tank, "Light tank");
strcpy_s(company[1].name_of_tank, "Griffin II");
company[1].count_of_tanks = 90;
company[1].caliber_of_tanks = 120;
// атрилерия
strcpy_s(company[1].type_of_artillery, "Rocket artillery");
strcpy_s(company[1].name_of_artillery, "M142 HIMARS");
company[1].count_of_artillery = 90;
company[1].caliber_of_artillery = 227;
// 3 рота ----------------------------------
// экипировка
company[2].count_of_body_armor = 150;
company[2].count_of_helmets = 290;
company[2].count_of_thermal_imagers = 200;
company[2].count_of_aid = 330;
// танки
strcpy_s(company[2].type_of_tank, "Heavy tank");
strcpy_s(company[2].name_of_tank, "Leopard II");
company[2].count_of_tanks = 50;
company[2].caliber_of_tanks = 120;
// атрилерия
strcpy_s(company[2].type_of_artillery, "Howitzer");
strcpy_s(company[2].name_of_artillery, "M777");
company[2].count_of_artillery = 70;
company[2].caliber_of_artillery = 155;
int& linkSIZE = SIZE;
AddElement(company, linkSIZE);
ShowCompany(company, linkSIZE);
//cout << company[3].caliber_of_artillery;
}
void AddElement(armament company[], int& SIZE) // добавление элемента массива
{
char log[50] = "AddElement function used\n";
SIZE++;
armament* newArr = new armament[SIZE]; // выделение памяти
for (int i = 0; i < SIZE; i++)
{
if (i == SIZE - 1)
{
// экипировка
int count_of_body_armor; // количество бронежилетов
cout << "Enter count of body armor: ";
cin >> count_of_body_armor;
int count_of_helmets; // количество касок
cout << "Enter count of helmets: ";
cin >> count_of_helmets;
int count_of_thermal_imagers; // количество тепловизоров
cout << "Enter count of thermal imagers: ";
cin >> count_of_thermal_imagers;
int count_of_aid; // количество аптечек
cout << "Enter count of aid: ";
cin >> count_of_aid;
// танки
char type_of_tank[50]; // тип танка
cout << "Enter type of tank: ";
cin >> type_of_tank;
char name_of_tank[30]; // название танка
cout << "Enter name of tank: ";
cin >> name_of_tank;
int count_of_tanks; // количество танков
cout << "Enter count of tanks: ";
cin >> count_of_tanks;
float caliber_of_tanks; // калибр орудия
cout << "Enter caliber of tanks: ";
cin >> caliber_of_tanks;
// атрилерия
char type_of_artillery[50]; // название артиллерии
cout << "Enter type of artillery: ";
cin >> type_of_artillery;
char name_of_artillery[30]; // тип артиллерии
cout << "Enter name of artillery: ";
cin >> name_of_artillery;
int count_of_artillery; // количество артиллерии
cout << "Enter count of artillery: ";
cin >> count_of_artillery;
float caliber_of_artillery; // калибр орудия
cout << "Enter caliber of artillery: ";
cin >> caliber_of_artillery;
// экипировка
newArr[i].count_of_body_armor = count_of_body_armor;
newArr[i].count_of_helmets = count_of_helmets;
newArr[i].count_of_thermal_imagers = count_of_thermal_imagers;
newArr[i].count_of_aid = count_of_aid;
// танки
strcpy_s(newArr[i].type_of_tank, type_of_tank);
strcpy_s(newArr[i].name_of_tank, name_of_tank);
newArr[i].count_of_tanks = count_of_tanks;
newArr[i].caliber_of_tanks = caliber_of_tanks;
// атрилерия
strcpy_s(newArr[i].type_of_artillery, type_of_artillery);
strcpy_s(newArr[i].name_of_artillery, name_of_artillery);
newArr[i].count_of_artillery = count_of_artillery;
newArr[i].caliber_of_artillery = caliber_of_artillery;
}
else
{
newArr[i] = company[i];
}
}
company = newArr;
//cout << company[SIZE - 1].caliber_of_artillery << endl;
delete[] newArr; // очистка памяти
//cout << company[SIZE - 1].caliber_of_artillery << endl;
//WritingToLog(log);
/*system("pause");
system("cls");
ShowMenu(company, SIZE);*/
}
void ShowCompany(armament company[], int& SIZE) // вывод массива
{
char log[50] = "ShowCompany function used\n";
for (int i = 0; i < SIZE; i++)
{
cout << "company " << i + 1 << endl;
cout << "\nequipment: " << endl;
cout << "Count of body armor: " << company[i].count_of_body_armor << endl;
cout << "Count of helmets: " << company[i].count_of_helmets << endl;
cout << "Count of thermal imagers: " << company[i].count_of_thermal_imagers << endl;
cout << "Count of aid: " << company[i].count_of_aid << endl;
cout << "\ntanks: " << endl;
cout << "Type of tank: " << company[i].type_of_tank << endl;
cout << "Name of tank: " << company[i].name_of_tank << endl;
cout << "Count of tanks: " << company[i].count_of_tanks << endl;
cout << "Caliber of tanks: " << company[i].caliber_of_tanks << endl;
cout << "\nartillery: " << endl;
cout << "Type of artillery: " << company[i].type_of_artillery << endl;
cout << "Name of artillery: " << company[i].name_of_artillery << endl;
cout << "Count of artillery: " << company[i].count_of_artillery << endl;
cout << "Caliber of artillery: " << company[i].caliber_of_artillery << endl;
cout << "\n==========================================\n";
}
//WritingToLog(log);
//system("pause");
//system("cls");
//ShowMenu(company, SIZE);
}
Ответы (2 шт):
Автор решения: Harry
→ Ссылка
Упс.
company = newArr;
delete[] newArr;
Все, теперь company указывает на освобожденную память!
Но и это еще не все :) — void AddElement(armament company[], т.е. company передается по значению, так что изменяется копия указателя...
Надо поменять:
void AddElement(armament* &company, int& SIZE); // добавление элемента массива
void ShowCompany(armament* & company, int SIZE); // вывод массива
Выбросить пляски с int&listSIZE и просто вызывать
AddElement(company, SIZE);
ShowCompany(company, SIZE);
Ну, и в AddElement написать
delete[] company;
company = newArr;
//cout << company[SIZE - 1].caliber_of_artillery << endl;
//delete[] newArr; // очистка памяти
Автор решения: Анонимный Паша
→ Ссылка
Вы очищаете ту память которую вы используете:
company = newArr;
//cout << company[SIZE - 1].caliber_of_artillery << endl;
delete[] newArr; // <- ошибка тут
Очищать надо перед выходом из программы
И вместо armament company[] используйте armament *&company
