如何阻止此内存泄漏

时间:2018-11-04 10:02:02

标签: c++ pointers memory-management memory-leaks

我正在学习C ++的指针,并且正在研究new和delete功能。 我有一个本地函数在堆上分配内存,但是由于我要返回创建的2d数组,因此我不知道如何解决此内存泄漏问题,我们将不胜感激

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 :(得分:3)

要解决此问题,您需要delete进行new的操作。

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);

答案 1 :(得分:3)

在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]);

    // ...