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

时间:2019-02-23 01:27:41

标签: c++ pointers memory-management memory-leaks

考虑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;
}

作为旁注,我知道使用向量和/或唯一指针更安全,但是我对上面代码的功能感到好奇,特别是当声明指针但稍后对其进行初始化时会发生什么。

2 个答案:

答案 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()来“压缩”它。如果您使用的是垃圾回收语言(或使用智能指针),则在这种情况下将回收内存。