内存释放 C++

Memory deallocation c++

本文关键字:C++ 释放 内存      更新时间:2023-10-16

我显然误解了使用delete的东西。为什么这个程序填满了我的记忆?

void f(int* x){
    x = new int[42];
}
int main(){
    while(true){
        int* x;
        f(x);
        delete[] x;
    }
    return 0;
}

如何从main函数内部释放我在f中分配的内存?

您实际上并没有修改外部函数中的x变量。
为此,您必须依赖返回值 f

int* f(){
    return new int[42];
}
int main(){
    while(true){
        int* x = f();
        delete[] x;
    }
    return 0;
}

或者通过引用传递变量x

void f(int*& x){
    x = new int[42];
}
int main(){
    while(true){
        int* x;
        f(x);
        delete[] x;
    }
    return 0;
}

或者使用指向指针的指针作为指向f的参数:

void f(int** x){
    *x = new int[42];
}
int main(){
    while(true){
        int* x;
        f(&x);
        delete[] x;
    }
    return 0;
}

等等...

函数中存在内存泄漏

void f(int* x){
    x = new int[42];
}

您分配内存,但从不释放它。函数参数是函数的局部变量。该函数处理原始指针的副本。副本的任何更改都不会影响原始参数。

并且程序具有未定义的行为,因为指针x未初始化。

int main(){
    while(true){
        int* x;
        ^^^^^^
        f(x);
        delete[] x;
    }
    return 0;
}

您需要通过引用传递原始指针。所以函数应该像这样定义

void f(int* &x){
    x = new int[42];
}

并被称为喜欢

f(x);

或定义如下

void f(int* *x){
    *x = new int[42];
}

并被称为喜欢

f( &x );

通过引用传递参数。您正在按值传递它。

所以你可能想做的是考虑构造一个使用 RAII 的函子/类/结构......

我的意思是标准库如何处理大量分配。

struct A {
A(){/*allocate mem*/}
~A(){/*deallocate mem*/}
}

对于您的特定功能,

void f(int** x);

很可能是您想要的签名。这将允许您通过指向数组的指针来修改数组。虽然。。。我仍然建议不要这样做...原因是如果您决定分配一堆数组怎么办?主要方法是否负责解除分配内存?