分配指针时的内存泄漏

Memory leak in assigning pointers

本文关键字:内存 泄漏 指针 分配      更新时间:2023-10-16

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 ed,但delete -ion不再有指针引用它们)

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

另一点是,你的if ( p_long )检查基本上只会是NULL,在这种情况下,你当前的new堆分配器的类型(long)有问题分配(例如内存不足),下面的if ( 0 == *p_long )检查新分配的long被自动初始化为0的值。据我所知,情况并非如此,因为在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分配新的分配内存地址之前删除已分配的内存。

注意:delete对于NULL也是安全的