1

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

因此,如果我要执行以下操作:

int* test()
{
    int* x = new int(5);
    return x;
}

int main(int argc, char** argv)
{
    int* y = test();

    delete y;

    return 0;
}

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

4

4 回答 4

7

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

int test()
{
    return 5;
}

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

如果可以,请避免动态分配。

于 2013-05-21T06:55:59.777 回答
2

您的代码不会泄漏(正如其他人已经说过的那样)。然而,它需要很少的破坏和潜在的泄漏:

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;
}
于 2013-05-21T07:07:17.720 回答
1

Apointer就像 ist name 所述,只是一个指向堆上对象的地址。所以你所做的工作非常好。

请参阅此处以获取不同的线程。

于 2013-05-21T06:56:29.910 回答
1

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

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

于 2013-05-21T07:03:21.383 回答