C++ 内存释放c++;

C++ 内存释放c++;,c++,pointers,reference,C++,Pointers,Reference,我使用删除显然误解了某些内容。 为什么这个程序填满了我的记忆 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*

我使用
删除
显然误解了某些内容。
为什么这个程序填满了我的记忆

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;
}
void f(int** x){
    *x = new int[42];
}

int main(){
    while(true){
        int* x;
        f(&x);
        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
的参数:

int* f(){
    return new int[42];
}

int main(){
    while(true){
        int* x = f();
        delete[] x;
    }
    return 0;
}
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];
}
void f(int* *x){
    *x = new int[42];
}
打电话给我

f(x);
f( &x );
或者定义为

void f(int* &x){
    x = new int[42];
}
void f(int* *x){
    *x = new int[42];
}
打电话给我

f(x);
f( &x );

<>你想做的是考虑构造一个使用RaII…/P>的函子/类/结构 我指的是标准库如何处理大量分配

struct A {
A(){/*allocate mem*/}
~A(){/*deallocate mem*/}
}
为了你的特殊功能

void f(int** x);
很可能是你想要的签名。这将允许您通过指向数组的指针修改数组。虽然。。。我仍然建议不要这样做。。。原因是,如果您决定分配一组数组,该怎么办?main方法是否负责释放内存