通过函数释放内存-是吗?

时间:2019-05-06 01:00:42

标签: c++

当我试图通过函数删除一个新分配的变量时,为什么要打印相同的内存地址,我有点困惑,我猜没有内存泄漏或指针悬空。

打印了相同的内存地址。

#include <iostream>

using namespace std;

void deallocater(int *p)
{
    delete p;
    p = nullptr; // memory deleted and no dangling pointer right?
}

int main()
{
    int *x = new int(1);
    cout<<x;
    deallocater(x);

    cout<<endl<<x; // why is the same memory address being printed?

    return 0;
}

我认为该功能已成功运行

2 个答案:

答案 0 :(得分:7)

调用函数

void deallocater(int* p)
{
    delete p;
    p = nullptr;
}

通过

deallocater(x);

x的值复制到p。因此,在deallocater()中为局部变量p分配了nullptr。但是,调用程序的变量x不变。

您可以通过引用引用来实现您想要的目标:

void deallocater(int* &p)
{
    delete p;
    p = nullptr;
}

但是,不应将内存分配和取消分配拆分为不同且不相关的功能,以避免出现指针悬垂和/或内存泄漏的危险。相反,好的C ++代码几乎不包含任何delete语句和很少的new语句(用于初始化智能指针),而是使用标准的库结构(容器和智能指针)进行内存管理。

答案 1 :(得分:2)

该代码无法更改p中指针deallocater()的内容,因此在打印时它仍显示相同的值。调用p之后,仍然具有相同的(指针)值,但是指向的内存已释放。这就是所谓的“悬空参考”。

要更新指针,请使用双指针或对指针的引用:

void deallocater(int **p)
{
    delete *p;
    *p = nullptr; // memory deleted and no dangling pointer right?
}

int main()
{
    int *x = new int(1);
    cout<<x;
    deallocater( &x );

    cout<<endl<<x; // why is the same memory address being printed?

    return 0;
}