繁体   English   中英

分配指针时内存泄漏

[英]Memory leak in assigning pointers

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;

谢谢。

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

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

另一点是你的if ( p_long )检查基本上只是在你的当前new类型分配器( long )分配有问题(例如内存不足)的情况下才会变为NULL ,并且以下if ( 0 == *p_long )检查新分配的long是否自动初始化为0 AFAIK并非如此,因为在C ++中,您只需为所需内容付费。 该值未定义(实际上,它可能是该内存地址处的现有未阻尼值)。

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;
        }
     }
  }
}

第一次输入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分配新的已分配内存地址之前删除已分配的内存。

注意: 删除也可以安全地用于NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM