Invalid allocation size: 4294967295 bytes при итерировании по массиву

Рейтинг: 0Ответов: 1Опубликовано: 25.03.2015

Пишу программку для работы с множествами (лабораторная). Во время выполнения программы возникает ошибка (описание в заголовке). В программе я впервые использовал указатели и предполагаю, что ошибку допустил именно при работе с ними, но, в чём состоит ошибка, понять не могу.

//Прототипы функций
void getInputSet(int*, int);
void getPredicSet(int*, int);
void getFuncSet(int*, int);
int* sumSet(int*, int, int*, int);
void showSet(int*, int);

int main()
{
    int setNumb = 3; //количество множеств
    int* size = new int[setNumb]; //размеры множеств
    int** A = new int* [setNumb]; //указатель на массив указателей на множества

 //Получаем количество элементов А1
    cout << "Enter the size of A1: ";
    cin >> size[0];
    //Создаём указатель на массив элементов
    A[0] = new int[size[0]];
    getInputSet(A[0], size[0]); //ввод
    //Вывод результата
    cout << "A1 = ";
    showSet(A[0], size[0]);

        ...
        //Ввод и вывод ещё двух множеств
        ...

    //Вычисляем универсум для A1, A2 и А3
    int* U;  //универсум
    int sizeU = size[0]; //размер универсума
    for(int i = 0; i < setNumb; i++)
    {
        sizeU += size[i+1];
        int* temp = sumSet(A[i], size[i], A[i+1], size[i+1]); //ОШИБКА ТУТ
        if (i == setNumb - 1) //если последняя итерация
        {
            U = temp;
            delete [] temp; //удаляем временный массив
        }
    }

Подскажите, пожалуйста, в чём же всё-таки проблема. P.S. Не знаю, нужна или нет, но на всякий случай:

//Объединяет множества
int* sumSet(int *set1, int n1, int *set2, int n2)
{
int* temp = new int[n1+n2];
int numbOfNotUnique = 0; //количество не уникальных

//Получение элементов первого множества
for (int i = 0; i < n1; i++)
{
    bool isUnique = true;
    //проверка на уникальность
    for (int j = 0; j < i; j++)
    {
        if (set1[j] == set1[i])
        {
            ++numbOfNotUnique;
            isUnique = false;
            break;
        }
    }
    //присвоение уникального значения элементу массива
    if (isUnique)
        temp[i-numbOfNotUnique] = set1[i]; //индекс с учётом количества неуникальных
}

//Получение элементов второго множества
for (int i = 0; i < n1; i++)
{
    bool isUnique = true;
    //проверка на уникальность
    for (int j = 0; j < i; j++)
    {
        if (set2[j] == set2[i])
        {
            ++numbOfNotUnique;
            isUnique = false;
            break;
        }
    }
    //присвоение уникального значения элементу массива
    if (isUnique)
        temp[i-numbOfNotUnique] = set2[i]; //индекс с учётом количества неуникальных
}
int* res = new int[n1+n2-numbOfNotUnique];
for (int k = 0; k<n1+n2-numbOfNotUnique; k++)
    res[k] = temp[k];
delete [] temp;
return res;
}

Ответы

▲ 1
  1. int* size = new int[setNumb]; //размеры множеств
  2. Нумерация вышеупомянутого "массива" (криво на c/c++ звучит) от 0 до setNumb-1
  3. for(int i = 0; i < setNumb; i++) // ИДЕТ цикл от 0 до setNumb-1
  4. int* temp = sumSet(A[i], size[i], A[i+1], size[i+1]); //ОШИБКА ТУТ size[i+1] - однозначно выйдет за границу.

Коллега, проверь, размерность массивов и использование этих размерностей.