【问题标题】:How to stop this memory leak如何阻止这种内存泄漏
【发布时间】:2018-11-04 10:02:01
【问题描述】:

我正在学习 C++ 中的指针,并且正在研究新功能和删除功能。 我有一个在堆上分配内存的本地函数,但是因为我正在返回我创建的二维数组,所以我不明白如何解决这个内存泄漏,任何帮助将不胜感激

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

整数.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 ;
}

整数.h

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

编译

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

我听说过智能指针,并计划在此之后了解它们,但现在我想知道是否有办法解决这个问题,或者我应该只使用智能指针吗?

【问题讨论】:

  • 我的建议是你根本不要使用指针,而是使用std::vector(或者对于编译时固定数组使用std::array)。
  • 只需将变量“a”设为全局变量
  • @Someprogrammerdude 是我的方法不是标准做法还是存在一些固有问题?我现在正在学习指针,不想使用向量。
  • @akshay 不,全局变量几乎从不解决任何问题。全局变量通常不好。
  • @akshay - 请将这个糟糕的建议放在答案部分,可能会被相应地否决。还是您故意规避 SO 的质量控制?

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


【解决方案1】:

要解决这个问题,你需要deletenew'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);

【讨论】:

  • 可能还值得添加一个delarr 函数来补充genarr
【解决方案2】:

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

    // ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-01
    • 2019-07-17
    • 2016-08-14
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多