我正在学习 C++,并且正在阅读有关指针的内容。我对以下场景感到好奇:
场景一:
如果我没记错的话,如果用户输入-1
,就会出现内存泄漏:
#include <iostream>
using namespace std;
int main(){
int *p = new int;
cout << "Please enter a number: ";
cin >> *p;
if (*p == -1){
cout << "Exiting...";
return 0;
}
cout << "You entered: " << *p << endl;
delete p;
return 0;
}
场景 2:
但是下面的代码会发生什么?从我读过的内容来看,如果我错了,请纠正我,当在第二种情况下声明一个指针时,一旦你超出范围,指针就会被清除。那么如果用户不输入-1
,*p
会被自动清除吗?
#include <iostream>
using namespace std;
int main(){
int x;
int *p = &x;
cout << "Please enter a number: ";
cin >> *p;
if (*p == -1){
cout << "Exiting...";
return 0;
}
cout << "You entered: " << *p << endl;
return 0;
}
如果我在第二种情况下输入-1
会怎样?
最佳答案
不要过分关注指针的使用。内存泄漏通常与指针指向的内存有关,而不是与指针本身有关。
在这段代码中:
int x;
int *p = &x;
没有内存泄漏,因为没有需要显式释放的内存(没有动态分配的内存)。 int x
是一个具有自动存储持续时间的变量,当执行超出范围时会自动清理,而 int *p = &x;
只是一个指针,保存x
所在的内存地址。
但是你是对的,代码如下:
Resource* r = new Resource();
if (something) {
return -1;
}
delete r;
存在内存泄漏,因为存在不释放分配内存的返回路径(退出路径)。请注意,如果抛出异常而不是调用 return
,也会发生同样的情况......确保所有资源都被正确释放是其中之一您应该更多地了解智能指针 的主要原因是, RAII idiom 并尝试优先选择具有自动存储持续时间的对象,而不是动态分配的对象。
关于c++ - 指针总是会导致内存泄漏还是在超出范围时被删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21406193/