我显然误解了使用delete
的内容。
为什么这个程序会填满我的记忆?
void f(int* x){
x = new int[42];
}
int main(){
while(true){
int* x;
f(x);
delete[] x;
}
return 0;
}
如何从f
函数中释放main
中分配的内存?
答案 0 :(得分:4)
您实际上并未修改外部函数中的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;
}
等等......
答案 1 :(得分:2)
功能
中存在内存泄漏void f(int* x){
x = new int[42];
}
你分配内存但从未释放它。函数参数是函数的局部变量。该函数处理原始指针的副本。副本的任何更改都不会影响原始参数。
并且mpreover程序具有未定义的行为,因为指针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 );
答案 2 :(得分:1)
通过引用传递参数。你按价值传递它。
答案 3 :(得分:-1)
所以你可能想要做的是考虑构建一个使用RAII的仿函数/类/结构......
我的意思是标准库如何处理大量的分配。
struct A {
A(){/*allocate mem*/}
~A(){/*deallocate mem*/}
}
对于您的特定功能,
void f(int** x);
很可能是您想要的签名。这将允许您通过指向它的指针修改数组。虽然......我仍然建议不要这样做...原因是如果你决定分配一堆数组呢?主要方法是否负责释放内存?