分配指针时内存泄漏

时间:2013-05-28 09:27:02

标签: c++ visual-c++ memory-leaks

temp = p_long;显示内存泄漏。我不确定它是如何泄漏的。

long *temp = NULL; 
for (int i = 1; i < 10; i++) {
  if (i < 3) {
     long *p_long = new long;

     if ( p_long ) {
        if ( 0 == *p_long ) {
           flag = true;
        } else if ( 1 == *p_long ) {
           temp = p_long;                    -----> showing memory leak here
           continue;
        }
     }
  }
}

if (temp)
delete temp;

感谢。

3 个答案:

答案 0 :(得分:2)

你没有释放堆分配long *p_long = new long;考虑到它是一个for循环,你将有一些孤立的内存块(new ed,但没有引用它们的指针delete - 离子。)

如果未将p_long分配给temp,则必须在循环的相应部分释放continue。您的break语句是多余的(也许您的意思是NULL?)。此外,现代版nullptrif ( p_long )

另一点是,如果您当前NULL该类型的new堆分配器(long)出现问题,那么if ( 0 == *p_long )检查基本上只会是long分配(例如,内存不足),并且以下0正在检查新分配的{{1}}是否已使用值{{1}}自动初始化。 AFAIK并非如此,因为在C ++中,您只需为所需内容付费。该值未定义(实际上,它可能是该内存地址处的现有未被篡改的值)。

答案 1 :(得分:0)

long *temp = NULL; 
for (int i = 1; i < 10; i++) {
  if (i < 3) {
     long *p_long = new long;

     if ( p_long ) {
        if ( 0 == *p_long ) {
           flag = true;
        } else if ( 1 == *p_long ) {
           if(temp)
              delete temp; -----> leaked memory freed here
           temp = p_long;                   
           continue;
        }
     }
  }
}

答案 2 :(得分:0)

第一次输入for循环tempNULL时,在以后的迭代中,您会为指针分配动态内存。

long *p_long = new long;

在某些迭代中,您只需覆盖指针中包含的地址。您将忘记使用new分配的内存。这并不意味着它会自动释放。内存仍然被分配,只是你丢失了它的指针。

temp = p_long;     

你需要类似的东西,

else if ( 1 == *p_long ) 
{
     delete temp; -----> leaked memory freed here. 
     temp = p_long;                   
continue;
}

在将新分配的内存地址分配给temp之前,这将删除已分配的内存。

注意:delete is safe to use on NULL也是