[英]Possible memory leak when returning pointer (array) (C++)
考虑一下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
原来的地址将被泄漏。 那是对的吗?
此外,在调用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
时不初始化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时不初始化x,但不过早删除它,它是否指向将泄漏的内存?
没有。
附带说明一下,我知道使用向量和/或唯一指针更安全
绝对。 即使没有这些代码可能是更清晰了很多关于内存的所有权,使得你的问题就不会出现,甚至,但它是真的,切换到标准箱/智能指针会就在源头上解决问题,我强烈建议这一点。
tl; dr:到目前为止,您对所有事情都是正确的
在上面的代码段中:
int *x = new int [1000];
x = foo();
delete[] x;
您为x分配了一个数组指针,然后通过为其分配foo()来“压缩”它。 如果您使用的是垃圾回收语言(或使用智能指针),则在这种情况下将回收内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.