При добавлении нового элемента в массив структур, сохраняется мусор

результат консоли

#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; // очистка памяти

См. https://ideone.com/Or84ME

→ Ссылка
Автор решения: Анонимный Паша

Вы очищаете ту память которую вы используете:

    company = newArr;
    //cout << company[SIZE - 1].caliber_of_artillery << endl;
    delete[] newArr; // <- ошибка тут

Очищать надо перед выходом из программы И вместо armament company[] используйте armament *&company

→ Ссылка