考虑一下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;
}
作为旁注,我理解使用向量和/或唯一指针更安全,但我很好奇上面代码的功能,特别是当声明指针但稍后初始化时会发生什么。
创建x时,它指向内存地址。当调用foo()时,会创建一个指向不同地址的新指针y,但x会被设置为y所具有的地址。因此,当它被删除时,新地址的内存被释放,但x的原始地址被泄露。那是对的吗?
是。
这是否意味着我防止泄漏?
是。
还有一个最后的问题,如果我在声明它时没有初始化x,但是不要过早地删除它,它是否指向将被泄露的内存?
没有。
作为旁注,我理解使用矢量和/或唯一指针更安全
绝对。即使没有那些你的代码可以更清楚地了解内存所有权,这样你的问题甚至不会出现,但是切换到标准容器/智能指针确实可以在源头上解决问题,我强烈推荐这一点。
tl;博士:到目前为止你对一切都是对的
在上面的代码段中:
int *x = new int [1000];
x = foo();
delete[] x;
你为x分配了一个数组指针,但是通过为它指定foo()来“压缩”它。如果您使用垃圾收集语言(或使用智能指针),则在这种情况下将回收内存。