Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回指针(数组)(C+;+;)时可能存在内存泄漏_C++_Pointers_Memory Management_Memory Leaks - Fatal编程技术网

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

C++ 返回指针(数组)(C+;+;)时可能存在内存泄漏,c++,pointers,memory-management,memory-leaks,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拥有的原始地址被泄漏。对

考虑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()

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;dr:到目前为止,你在上面的片段中所说的一切都是对的

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

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

格式正确的问题;非常感谢。按照我的理解,一个未初始化的指针还没有真正指向任何东西。一个未初始化的指针指向某个地方,但它并不指向任何安全的地方。在现代系统中,它通常指向瞬间死亡,而冷酷的垃圾收集器则乐此不疲。但有时它会指向分配给程序的内存,这些内存可能是查找和调试的绝对值。这里的代码与那里的代码没有任何关系,只是覆盖了内存,当程序在那里出错时,你可能不会在这里调试代码。@Daniel更正。@user4581301“指针将指向。未初始化的指针指向某个地方,但它不会指向任何安全的地方”这是一个语义问题。很容易争辩说,未初始化的指针确实不会“指向某处”,因为没有UB(其值未指定)您无法观察其值。实际上,它有一些任意的数值,你可以将其描述为“指向某个可能不安全的地方”,但这并不是语言所认为的,你也不应该这样认为。