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

问题描述 投票:2回答:2

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

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

c++ pointers memory-management memory-leaks
2个回答
3
投票

创建x时,它指向内存地址。当调用foo()时,会创建一个指向不同地址的新指针y,但x会被设置为y所具有的地址。因此,当它被删除时,新地址的内存被释放,但x的原始地址被泄露。那是对的吗?

是。

这是否意味着我防止泄漏?

是。

还有一个最后的问题,如果我在声明它时没有初始化x,但是不要过早地删除它,它是否指向将被泄露的内存?

没有。

作为旁注,我理解使用矢量和/或唯一指针更安全

绝对。即使没有那些你的代码可以更清楚地了解内存所有权,这样你的问题甚至不会出现,但是切换到标准容器/智能指针确实可以在源头上解决问题,我强烈推荐这一点。


tl;博士:到目前为止你对一切都是对的


0
投票

在上面的代码段中:

int *x = new int [1000];
x = foo();
delete[] x;

你为x分配了一个数组指针,但是通过为它指定foo()来“压缩”它。如果您使用垃圾收集语言(或使用智能指针),则在这种情况下将回收内存。

© www.soinside.com 2019 - 2024. All rights reserved.