我正在学习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
我听说过智能指针,并打算在此之后对其进行学习,但是现在我想知道是否有办法解决此问题,或者我应该只选择智能指针吗?
答案 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]);
// ...