c++ - 指针总是会导致内存泄漏还是在超出范围时被删除?

标签 c++ pointers memory-management memory-leaks 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;
}

场景 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/

相关文章:

c++ - QFtp 仅在目录不存在时才创建目录

c++ - 通过指针调整数组大小

c - 为什么指向 char 数组的指针在右值之间不同是 &"hello"和 char 数组?

Android资源匮乏操作

c++ - 在不破坏保留元素的情况下更改 vector 的大小

c++ - 如果由于接收对象的线程已结束而未处理 Qt 信号,是否会删除参数?

c++ - gzseek(zlib) 在偏移量太大时失败(大于 signed int 2^32 的范围)?

c++ - Stringstream 到 Vector<char> 抛出 std::bad_alloc

c++ - 调用 strtok() 时发生访问冲突; C++

c - C 中的函数指针、数组和左值