матрица передачи c ++ в процедуру, утечки памяти - PullRequest
0 голосов
/ 25 мая 2011

Я брожу. я не могу поверить своим глазам! если я выделю матрицу во входе процедуры, после выхода из процедуры матрица будет удалена!

void input(int **x,int& m,int &n)
{
    int i,j;
    x=new int*[mx];

    for(i=0;i<mx;i++)
        x[i]=new int[nx];

    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            scanf("%d",&x[i][j]);   

    for(i=0;i<mx;i++)
        for(j=0;j<nx;j++)
            printf("%d",x[i][j]); - i see normal matrix
}

int main()
{
    int **x,**y,mx,my,nx,ny;
    int i,j;

    input(x,mx,nx);   
    for(i=0;i<mx;i++)
        for(j=0;j<nx;j++)
            printf("%d",x[i][j]); - i receive a lot of stuff

    return 0;
}

почему матрица была удалена? как я понимаю, я передаю ** х, это указывает на часть памяти, там матрица лежит. но когда я вернулся на главную, я потерял матрицу, я не удалил ее. почему я потерял матрицу?

если я сделаю это в основной функции

x=new int*[mx];

for(i=0;i<mx;i++)
    x[i]=new int[nx];

все в порядке

Ответы [ 4 ]

2 голосов
/ 25 мая 2011

x передается по значению input;Какие бы изменения input ни делал для x внутри себя, они не будут видны снаружи input.(Подсказка: попробуйте printf("%p\n", x) внутри и снаружи input).Итак, если вы хотите решить эту проблему с наименьшим количеством модификаций в вашем коде, вы должны использовать здесь тройную косвенность (то есть int ***x) и передать &x в input.Но это очень простой способ делать вещи;в C ++ вам, скорее всего, лучше определить собственный класс Matrix и работать с ним.

2 голосов
/ 25 мая 2011

Используйте

void input(int & **x,int& m,int &n)

вместо

void input(int **x,int& m,int &n)

т.е. передайте x по ссылке, а не по значению.

1 голос
/ 25 мая 2011

Измените int** x на int**& x на входе функции.

1 голос
/ 25 мая 2011
void input(int **x,int& m,int &n)
{ 
  int i,j;
  x=new int*[mx];
  ...

Откуда приходят mx и nx?Из того, что я могу сказать, они не определены.

...