内存管理范围在C/ c++



在C和c++中释放内存时,我只需要内存地址还是需要任何特定的变量?

所以如果我要做这样的事情:

int* test()
{
    int* x = new int(5);
    return x;
}
int main(int argc, char** argv)
{
    int* y = test();
    delete y;
    return 0;
}

这会导致内存泄漏吗?谢谢!

不,那里不会有任何泄漏,但话又说回来,

里面也不会有。
int test()
{
    return 5;
}
int main(int argc, char** argv)
{
    int y = test();
    return 0;
}

您的代码,就像它一样,不会泄漏(正如其他人已经说过的)。然而,它对的要求非常小,就会中断并可能泄漏:

int* test()
{
    int* x = new int(5);
    return x;
}
int main(int argc, char** argv)
{
    int* y = test();
    int* z = test();
    delete y;
    delete z;
    return 0;
}

这段代码现在可能泄露,因为new可能抛出,如果对new (z=...)的第二次调用抛出,那么第一个指针(y)永远不能被删除。任何其他可以抛出的函数(不仅仅是对new的第二次调用)都会引起同样的问题。


这就是为什么智能指针是必须的:它们使用RAII并允许您编写异常安全的代码,这是体面的c++的基础。这段代码根本不能泄漏:

std::unique_ptr<int> test()
{
    std::unique_ptr<int> x(new int(5));
    return x;
}
int main(int argc, char** argv)
{
    std::unique_ptr<int> y = test();
    std::unique_ptr<int> z = test();
    return 0;
}

pointer,正如其名称所示,只是一个指向堆上对象的地址。所以你做得很好。

您只需要内存地址来释放已分配的空间。但是要确保相应地释放它(在c++中),即,如果它是一个数组,则调用delete y[],就像这样…

在C语言中,您只需要基址,当您调用free()时,将释放分配的全部空间。你的代码中不会有任何内存泄漏

最新更新