C++ 返回指针(数组)(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拥有的原始地址被泄漏。对
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(其值未指定)您无法观察其值。实际上,它有一些任意的数值,你可以将其描述为“指向某个可能不安全的地方”,但这并不是语言所认为的,你也不应该这样认为。