Проблема, с которой вы сталкиваетесь, находится в этом разделе кода, который вы опубликовали:
int ** maxc = new int *[proc_num];
for (int i = 0; i < proc_num; i++)
{
maxc[i] = new int*[n];
}
Внутри цикла for вы выделяете новый массив int
указателей, но оригиналтип для maxc
был типа указатель на указатель.В этом контексте это также может быть истолковано как «1006» - это указатель, который указывает на массив указателей.Это, конечно, выполняется в первом присваивании, когда вы возвращаете указатель из new
, который указывает на массив int*
.Поэтому оператор внутри цикла for назначает неправильный тип каждому элементу массива.Типом для элементов массива maxc[x]
являются int
указатели, что означает, что они должны указывать либо на один или несколько объектов типа int
, но не на элементы типа int*
.Но ваш оператор new
в цикле пытается выделить другой массив из указателей int
и вернуть указатель на этот выделенный массив, что означает, что возвращаемый тип снова равен int**
, и это не правильно.Поэтому вы должны изменить внутреннюю часть вашего цикла следующим образом:
maxc[i] = new int[n]; //allocate an array of int's, and return an int pointer
Я заметил, что первый фрагмент кода, который вы разместили, действительно делает это, так что, возможно, вы столкнулись с простой опечаткой, которую пропустили?1020 * Наконец, когда вы удаляете эту память, поскольку каждая строка была создана с использованием new
, вам придется вызывать delete
в каждой строке, представляющей массив int
.Затем вам нужно будет вызвать delete для столбца, представляющего массив int
указателей, которые указывали на массив int
.Таким образом, освобождение всей выделенной памяти будет выглядеть следующим образом:
for (int i=0; i < proc_num; i++)
{
//call delete on each pointer in each column of the array that is pointing to a
//row array of int's
delete [] maxc[i];
}
//call delete on the pointer pointing to the column of
//the array that contains the original int pointers that were
//pointing to each of the row arrays of int's
delete [] maxc;