考虑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
的地址。因此,删除该地址后,将释放新地址的内存,但x
拥有的原始地址将被泄漏。正确吗?
此外,我在调用delete[] x
之前先通过调用foo()
对代码段进行了少许更改,但仍可以编译并运行:
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;
}
作为旁注,我知道使用向量和/或唯一指针更安全,但是我对上面代码的功能感到好奇,特别是当声明指针但稍后对其进行初始化时会发生什么。
答案 0 :(得分:3)
创建x时,它指向一个内存地址。调用foo()时,将创建一个新的指针y,指向另一个地址,但随后将x设置为y的地址。因此,删除该地址后,将释放新地址的内存,但x原来的地址将被泄漏。正确吗?
是的
这是否意味着我防止了泄漏?
是的
最后一个问题,如果我在声明x时不初始化x,但不过早删除它,它是否指向将要泄漏的内存?
否。
作为补充,我了解使用向量和/或唯一指针更为安全
绝对。即使没有这些内容,您的代码也可以更清楚地了解内存所有权,因此甚至不会出现您的问题,但是,切换到标准容器/智能指针确实可以从源头上解决问题,我强烈推荐这个。
tl; dr:到目前为止,您对所有事情都是正确的
答案 1 :(得分:0)
在上面的代码段中:
int *x = new int [1000];
x = foo();
delete[] x;
您为x分配了一个数组指针,然后通过为其分配foo()来“压缩”它。如果您使用的是垃圾回收语言(或使用智能指针),则在这种情况下将回收内存。