2013-12-13 36 views
2
int *p = new int; 

p = NULL; 

delete p; 

这是一个内存泄漏吗?因为指针p指向的内存位置没有被释放,它只是已经被NULL的指针,当我们删除时,它不会腾出那个内存位置。是这样吗 ?在删除之前删除指针会导致内存泄漏吗?

+2

为什么有2个关闭的投票声明这是脱离主题,因为“询问代码的问题必须显示对所解决问题的最小理解”?这个问题甚至没有要求代码。在选择它之前,人们甚至会阅读关闭原因的文本吗? –

+0

想象一下你正在写'operator delete'。你是否能够释放你先前分配的内存,如果你给出的是一个空指针? –

回答

7

是的,它的确如此。是的,事实如此。需要更多的人物!

3

你会得到内存泄漏的原因是因为p将不再指向你想要删除的对象。

您通常想在删除后使NULL为p,主要是作为双重删除的安全措施,但这不是必需的。尽管如此,删除空指针没有不良影响。

+2

删除后将'p'设置为空指针实际上很少见,因为大部分时间,'p'将会超出范围(在析构函数中或在块末尾删除---大部分'delete',或者应该在析构函数中)。如果指针不再存在,那么将'p'设置为null将不起作用,并且不会对指向该对象的其他指针做任何事情。 (当然,在很多应用程序中,大多数'delete'都是'delete this',并且不能将'this'设置为null。) –

2

指针只是一个指向内存地址的值 - 指针不是(!)分配的内存!因此有一个新的会请求一些分配器来保留一些内存并返回地址。删除将要求相同的分配器释放该内存。将指针设置为零(在删除之前)会使它失效并导致内存泄漏。

0

首先,在C++中删除NULL指针实际上是“没有工作完成”。它也不会给出任何错误,有时可能会给你一个错误,即空指针被成功删除。其次,由于指针p指向的地址,比如说1000(内存地址值),除了这个非常指针以外,没有其他人指出它,现在你已经改变了这个只有1000的识别器,将它设置为NULL,发生的事情是这1000个已经获得了一个内存空间,但现在不能被删除,因为“如果我什至不知道它在哪里,我该如何删除一些东西”。因此它是一个内存泄漏。