这会导致c ++中的内存泄漏吗?

时间:2014-05-10 11:28:19

标签: c++ memory-leaks

int* alloc()
{
    int* tmp = new int;
    return tmp;
}

int main()
{
    int* ptr = alloc();
    ......
    ......
    delete ptr;
    return 0;
}
  1. 这里我没有释放tmp但是ptr被明确释放了。也会tmp 被释放,因为ptr和tmp指的是相同的位置?

  2. 如果没有那么指针tmp会发生什么?它会导致内存泄漏吗?

2 个答案:

答案 0 :(得分:5)

不,这不会导致内存泄漏。内存泄漏是 buffers (内存块)已分配但未返回(当它们将不再使用时)。在alloc()函数中,tmp不是缓冲区...它是一个变量,在调用new之后,它包含地址一个缓冲区。您的函数返回此地址,该地址在main()中存储在ptr变量中。当您稍后调用delete ptr时,您将释放ptr指向的缓冲区,因此缓冲区已被释放且没有泄漏。

答案 1 :(得分:3)

您的程序不会导致内存泄漏 如果没有引发未捕获的异常

你可以做得更好,让它像这样100%防弹:

#include <memory>

std::unique_ptr<int> alloc()
{
    std::unique_ptr<int> tmp { new int };
    //... anything else you might want to do that might throw exceptions
    return tmp;
}

int main()
{
    std::unique_ptr<int> ptr = alloc();

    // other stuff that may or may not throw exceptions

    // even this will fail to cause a memory leak.
    alloc();
    alloc();
    alloc();

    auto another = alloc();

    // note that delete is unnecessary because of the wonderful magic of RAII
    return 0;
}

尽早养成这个习惯。