Sas*_*dar 3 c++ pointers memory-leaks memory-management dynamic-allocation
我正在学习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;
}
但是在下面的代码中会发生什么?根据我的阅读并纠正我,如果我错了,当在第二个场景中声明指针时,一旦你超出范围,指针就会被清除.因此,如果用户没有进入-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习惯用法的更多原因之一,并尝试使用动态分配的自动存储持续时间.