【问题标题】:C++ Do I have memory leak?C++ 我有内存泄漏吗?
【发布时间】:2013-08-17 11:49:02
【问题描述】:
istream& operator>>(istream& in,hhh& hh){

    double *arr,*temp;
    int i=0;
    char c;
    c=in.peek();
    while(c!='\n'){
        if(i>=1){
            temp=new double[++i];
            for(int j=0;j<i-1;j++){
                temp[j]=arr[j];
            }
            arr=temp;
        }
        else {
            arr=new double[++i];
        }
        in>>arr[i-1];
        c=in.peek();
    }
    hh.set(arr,i);
    delete [] arr;
    return in;
}

我有内存泄漏吗?我想知道我是否有,但我不确定,谢谢你的帮助。

【问题讨论】:

  • 你会的。在写arr = temp;之前,首先你必须delete [] arr;。 (另外,将temparr 初始化为nullptr,以便您第一次可以安全地delete []。)
  • 了解如何使用std::vector&lt;double&gt;

标签: c++ memory-leaks


【解决方案1】:

是的,你有。

当您创建较大的数组时,您不会删除较小的数组。

double* arr = 0;
int size = 0;
for (char c = in.peek(); c != '\n'; c = in.peek()) {
    double* temp = new double[++size];
    // memcpy(temp, arr, (size - 1) * sizeof(double));
    for (int i = 0; i != size - 1; ++i){
        temp[i] = arr[i];
    }
    delete [] arr;
    arr = temp;
    in >> arr[i-1];
}

或者更好,使用 std::vector arr;

std::vector<double> arr;
for (char c = in.peek(); c != '\n'; c = in.peek()) {
    double d;
    in >> d;
    arr.push_back(d);
}

【讨论】:

  • for (int i = 0; i != size - 1; ++i) 在 size = 0 时出错。请改用 i &lt; size
  • 你为什么评论 // memcpy(temp, arr, (size - 1) * sizeof(double));?
  • @MatsPetersson size 之前是递增的,不能为0
  • @MikeL 我让它作为下一个复制元素的循环的替代方案,所以使用其中一个。
【解决方案2】:

是的,你知道。在赋值arr=temp; 中,您覆盖旧指针而不释放它。我建议不要使用原始指针。而是使用 std::unique_ptr&lt; double[] &gt; 来包装您的指针。保证不会泄露。

例子:

std::unique_ptr< double[] > arr, temp;

arr.reset( new double[++i] ); // in C++14 you would use std::make_unique instead

【讨论】:

  • 所以当我指向 arr=temp,然后删除 [] arr 时,由于 arr 指向 temp,temp 被删除,对吗?
  • @MikeL 差不多,是的
猜你喜欢
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多