2014-09-28 4 views
0

Я хочу поменять местами две строки в матрице. Моя матрица - это выделенный массив памяти. У меня есть массив указателей, которые указывают на строки матрицы. Первый указатель указывает на этот большой выделенный блок. И другие указатели указывают на разные части или этот блок.Поменяйте указатель на выделенную память общим указателем

Если я поменяю местами две строки, кроме первой, это нормально. Но у меня проблемы с первой строкой. Я думаю, это потому, что указатель на первую строку отличается от другой. Но в чем основное отличие?

#include <iostream> 

int** allocateMatrix(int rows, int cols) { 
    // allocating array of pointers (rows) 
    int** matrix = new int*[rows]; 
    // allocating one solid block for the whole matrix 
    matrix[0] = new int[rows*cols]; 

    // setting the pointers for rows 
    for (int i = 1; i < rows; ++i) { 
     matrix[i] = matrix[i-1] + cols; 
    } 

    // fill the matrix with consecutive numbers 
    int k = 1; 
    for (int i = 0; i < rows; ++i) { 
     for (int j = 0; j < cols; ++j) { 
      matrix[i][j] = k; 
      k += 1; 
     } 
    } 

    return matrix; 
} 

void freeMatrix(int** matrix) { 
    delete[] matrix[0]; 
    delete[] matrix; 
} 

int main() { 
    int n = 3; 
    int m = 3; 
    int** matrix = allocateMatrix(n, m); 

    // swap the first and the second line 
    int* tmp = matrix[0]; 
    matrix[0] = matrix[1]; 
    matrix[1] = tmp; 

    // print matrix (it is printing ok) 
    for (int i = 0; i < n; ++i) { 
     for (int j = 0; j < m; ++j) { 
      std::cout << matrix[i][j] << ' '; 
     } 
     std::cout << std::endl; 
    } 

    // problem is here 
    freeMatrix(matrix); 

    return 0; 
} 
+0

Создайте класс матрицы, содержащий элемент 'vector >, и реализуйте функцию подкачки, которая вызывает переменную данных' std :: swap' или одну из ее строк. –

ответ

1

Главное отличие в том, что первый указатель был возвращен new[]. Удаление этого указателя освободит весь блок памяти, но удаление любого другого указателя в массиве будет иметь неопределенное поведение.

Вы можете сохранить указатель, который вы получаете от new[], и иметь дубликат «слабый» указатель на первую строку, которую вы храните в массиве указателей строк.

+0

Спасибо. Думаю, я об этом мало думал. Теперь я понимаю. – klimenkov

0

Ваш код не будет работать, если вы меняете сначала (0) и вторую (1) строки, потому что вы используете matrix[0], чтобы удалить выделение памяти.

Вам необходимо как-то «сохранить» исходное распределение, например.

int *origalloc; 

... 
origalloc = matrix[0] = new int[rows*cols]; 


... 
delete[] origalloc;  // Instead of malloc[0]; 

Что вы передаете delete или delete [] должен ли тот же указатель значение, как то, что вы получите обратно от new или new []. Все остальное - неопределенное поведение.

+0

Спасибо тоже. Если бы я мог дать второй ответ, я бы тоже его дал. – klimenkov

Смежные вопросы