Работа с динамической памятью. При выводе значений массива , иногда все в норме, а иногда в значениях мусор. В чем причина?

/* Даны два массива: А[M] и B[N] (M и N вводятся
с клавиатуры). Необходимо создать третий массив
минимально возможного размера, в котором нужно
собрать элементы массива A, которые не включаются
в массив B*/

#include <iostream>
using namespace std;

int main() {
    srand(time(NULL));
    setlocale(LC_ALL, "rus");
    
    int a, b;
    cout << "Введите размер первого массива: ";
    cin >> a;
    cout << "Введите размер второго массива: ";
    cin >> b;

    system("cls");

    int* arr = new int[a]; // создание первого массива с динамической памятью
    int* arr2 = new int[b];// создание второго массива с динамической памятью

    for (int i = 0; i < a; i++) // вывод 1-го массива
    {
        arr[i] = rand() % 10;
        cout << arr[i] << " ";
    }
    cout << " - ПЕРВЫЙ МАССИВ." << endl << endl;

    for (int i = 0; i < b; i++) // вывод 2-го массива
    {
        arr2[i] = rand() % 10;
        cout << arr2[i] << " ";
    }
    cout << " - ВТОРОЙ МАССИВ." << endl << endl;
    
    int* count = new int(0); // создание счетчика с динамической памятью
    int* arr3 = new int[*count]; // создание третьего массива размерностью счетчика

    for (int i = 0; i < a; i++) 
    {                                // проход по двум массивам 
        for (int j = 0; j < b; j++)
        {   
            if (arr[i] != arr2[j]) {                 // сравниваем равенства элементов двух массивов
                if (b == j + 1 && arr[i]!=arr2[j]) {        
                    *count += 1;
                    arr3[i] = arr[i];
                    cout <<"Уникальное число - "<< arr3[i] << endl;
                    break;
                }
                continue;
            }
            else if (arr[i] == arr2[j]) {
                break;
            }
        }
    }

    cout << endl << endl;

    for (int i = 0; i < *count; i++)        // Массив через раз выводит верно уникальные числа верно, а иногда выводит мусор. В чем причина(?????)
    {                                                       
        cout << arr3[i]<<" ";
    }
    cout << " - ТРЕТИЙ МАССИВ";

    delete[] arr;
    delete[] arr2;
    delete[] arr3;
    delete count;

    return 0;
}

Ответы (2 шт):

Автор решения: MBo

Что-то вы странное делаете...

Создайте третий массив целых чисел такой же размерности, как первый (a).

int* arr3 = new int[a];
int cnt = 0; 
for (int i = 0; i < a; i++) {
    int use = 1;
    for (int j = 0; j < b; j++)
        if (arr[i] == arr2[j]) {
            use = 0; 
            break;
        }
    if (use) {
       arr3[cnt++] = arr[i];
       cout <<"Уникальное число - "<< arr[i] << endl;
    }
}  

Теперь создайте новый массив длиной cnt и скопируйте в него cnt элементов arr3

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

Понимаете, при создании массива

int* arr3 = new int[*count];

память выделяется один раз. Так что у вас arr3 - указатель на 0 байт...

Ну как если бы вас мужики попросили притащить ящик пива. Вы на бумажке (переменная count) написали, скажем, "2 бутылки" (ну, 0 - очень уж смешно бы выглядело...), в магазине (менеджере памяти) показали бумажку, и попросили продать то, что написано. Вам дали это пиво, вы его принесли, достали бумажку, и исправили 2 на 20. После чего смотрите на свою покупку - а там почему-то так и остаются 2 бутылки пива, а не 20...

Эта ситуация не заставляет вас спрашивать - в чем причина? Почему мужики рассердились, пытаясь пить третью, четвертую, пятую бутылки пива? :)

→ Ссылка