c – 指针是否总是导致内存泄漏,或者当它们超出范围时会被删除?

我正在学习c,我正在读指针.我对以下场景感到好奇:

场景1:

如果我没弄错,如果用户键入-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;

存在内存泄漏,因为存在不释放分配的内存的返回路径(退出路径).请注意,如果抛出异常而不是返回被调用,则会发生同样的情况…确保正确释放所有资源是您应该了解有关智能指针的更多信息的主要原因之一,RAII idiom并尝试使用动态分配的自动存储持续时间.

转载注明原文:c – 指针是否总是导致内存泄漏,或者当它们超出范围时会被删除? - 代码日志