繁体   English   中英

返回指针(数组)时可能的内存泄漏(C ++)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM