考虑以下C++代码片段:
int *foo() {
int *y = new int[1000];
return y;
}
int main() {
int *x = new int [1000];
x = foo();
delete[] x;
return 0;
}
当创建变量
x
时,它会指向一个内存地址。当调用函数 foo()
时,会创建一个新的指针 y
,它指向另一个地址,但是变量 x
的值被设置为 y
的地址。因此,当删除 y
时,新地址的内存被释放,但是原始地址的内存泄漏了。这样说对吗?此外,我稍微修改了代码片段,在调用
foo()
之前调用了 delete[] x
,但仍然可以编译和运行:int *foo() {
int *y = new int[1000];
return y;
}
int main() {
int *x = new int [1000];
delete[] x;
x = foo();
delete[] x;
return 0;
}
这是否意味着我已经防止了内存泄漏?最后一个问题,如果我在声明变量 x
时没有初始化它,但没有过早地删除它,那么它是否指向将会泄漏的内存?就像下面这样:
int *foo() {
int *y = new int[1000];
return y;
}
int main() {
int *x;
x = foo();
delete[] x;
return 0;
}
作为一种旁注,我知道使用向量和/或唯一指针更安全,但我对上面的代码功能很好奇,特别是在声明但稍后初始化指针时会发生什么。