C++ 我有内存泄漏吗?

C++ Do I have memory leak?

本文关键字:泄漏 内存 C++      更新时间:2023-10-16
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;
}

我有内存泄漏吗?我试图弄清楚我是否有,但我不确定,谢谢你的帮助。

是的,你有。

创建较大的阵列时,不会删除较小的阵列。

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

是的,你愿意。在赋值arr=temp;中,您可以覆盖旧指针而不释放它。我建议不要使用原始指针。请改用std::unique_ptr< double[] >来包装指针。它将保证您不会泄漏。

例:

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