Как остановить эту утечку памяти - PullRequest
0 голосов
/ 04 ноября 2018

Я изучаю указатели на C ++ и работаю над новыми функциями и функциями удаления. У меня есть локальная функция, которая выделяет память в куче, но, поскольку я возвращаю созданный мной 2-мерный массив, я не понимаю, как устранить эту утечку памяти, любая помощь будет признательна

main.cpp

#include<iostream>
#include "integers.h"
using namespace std;
int main()
{
int i[]={1,2,3,4};
int n=sizeof(i)/sizeof(int);
cout<<n<<endl;
printint(genarr(i,n),n);
}

integers.cpp

#include<iostream>
using namespace std;
int** genarr(int* val,int n)
{
int i,j;
int **a=new int*[n];
for(i=0;i<n;i++)
a[i]=new int[n];

for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i==j)
a[i][j]=val[i];

return a; // The variable that will leak but because i am returning it , how do stop it
}

void printint(int** a,int n){
for(int i=0;i<n;i++)
 {
  for(int j=0;j<n;j++)
   {
    cout<<a[i][j]<<" ";
   }
cout<<endl;
}
return ;
}

integers.h

int** genarr(int*val, int n);
void printint(int **a,int n);

составлено

g++ main.cpp integers.cpp -o integers

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

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Самый простой способ избежать утечек памяти в C ++ - это избегать явного вызова delete в любом месте. Умные указатели могут решить эту проблему за вас.

В вашем конкретном случае вы можете попробовать что-то вроде этого (не проверено):

using Vector = unique_ptr<int[]>;
using Matrix = unique_ptr<Vector[]>;

Matrix genarr(const int* val, int n)
{
    Matrix a(new Vector[n]);
    for(int i=0;i<n;i++)
        a[i].reset(new int[n]);

    // ...
0 голосов
/ 04 ноября 2018

Чтобы решить проблему, вам нужно delete что вы new 'd.

Измените код в main на:

int **arr = genarr(i,n);
printint(arr,n);
// we're done using arr; now we need to free it
for(int j=0;j<n;j++)
    delete[] arr[j];
delete[] arr;

Вы также можете расширить integers.cpp и добавить функцию delarr, которая дополняет genarr:

void delarr(int **a, int n) {
    for (int i = 0; i < n; i++) {
        delete[] a[i];
    }
    delete[] a;
}

Тогда main становится просто:

int **arr = genarr(i,n);
printint(arr,n);
delarr(arr,n);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...