使用公共指针交换指向已分配内存的指针

时间:2014-09-28 16:26:51

标签: c++ pointers memory-management swap

我想在矩阵中交换两行。我的矩阵是一个分配的固体内存块。 我有一个指针数组,指向矩阵的行。第一个指针指向这个大的已分配块。其他指针指向不同的部分或这个块。

如果我交换任何两行,除了第一行,它就行了。但我的第一行有问题。 我想这是因为指向第一行的指针与其他指针不同。但主要区别是什么?

#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;
}

2 个答案:

答案 0 :(得分:1)

主要区别在于new[]返回了第一个指针。删除该指针将取消分配整个内存块,但删除数组中的任何其他指针将具有未定义的行为。

你可以分别存储从new[]得到的指针,并且有一个重复的&#34;弱&#34;指向保存在行指针数组中的第一行的指针。

答案 1 :(得分:0)

如果您交换第一行(0)和第二行(第一行),您的代码将无法正常工作,因为您正在使用matrix[0]删除内存分配。

你需要以某种方式&#34;保持&#34;原始分配,例如

 int *origalloc; 

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


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

您传递给deletedelete []的内容必须与您从newnew []获得的指针值相同。其他任何事都是未定义的行为。