int* alloc()
{
int* tmp = new int;
return tmp;
}
int main()
{
int* ptr = alloc();
......
......
delete ptr;
return 0;
}
这里我没有释放tmp但是ptr被明确释放了。也会tmp 被释放,因为ptr和tmp指的是相同的位置?
如果没有那么指针tmp会发生什么?它会导致内存泄漏吗?
答案 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;
}
尽早养成这个习惯。