这些代码是否泄漏内存(在无限循环中构造stl列表)?

时间:2013-12-13 14:03:01

标签: c++ memory-leaks stl

我做了一个示例程序来研究以局部方式区分多个stl对象是否会泄漏内存或超出堆栈大小。 “g_list”是一个全局列表,并从其他thread中吸收一些元素。请不要关心线程互斥,锁或其他东西(因为互斥锁和锁总是吸引人,不是吗?),只需支付这条线的吸引力“list rawDataList = g_list”,在这个循环中,每次都会构造一个列表,但是它永远不会超出它的范围,因为它处于无限循环中。

  • 这里没有rawDataList的“new”,它是一个局部变量而不是动态分配,我的意思是列表本身,而不是其中的元素;
  • 我们知道“clear”和“pop_front”会破坏列表中的元素
  • 我运行这段代码7小时,用顶级工具观察,内存量相当稳定,没有泄漏迹象 我的问题:
  • 每次我们通过调用“list rawDataList”来构造甚至为它分配一些东西,但是构造的列表永远不会超出范围所以永远不会被销毁,尽管它的元素在每个循环中被销毁,但是列表对象驻留在内存(堆栈区域)中,当我们循环数百万次时,堆栈如何包含这么多对象?
  • 并且,当第二次执行“list rawDataList = g_list”时,第一次构建的列表对象在哪里(它们具有相同的名称“rawDataList”)?
  • 为什么内存不会因此程序而泄露。

以下是代码:

    element e;  
    printf("in Cstlmem2::svc \n");
    int i =0;
    while(1){   
          pthread_mutex_lock(&m_mutex);
          while (g_list.empty()) // 为空,等待信号
          {
              pthread_cond_wait(&m_cond,&m_mutex);
          }

          list<element> rawDataList = g_list;
          g_list.clear();
          pthread_mutex_unlock(&m_mutex);

        while (!rawDataList.empty())
        {
            e = rawDataList.front();
            rawDataList.pop_front();

            int i = 0;
            while(i <1000000){
                i++;
            }

            printf("working in Cstlmem2::svc \n");
        }           
    }

2 个答案:

答案 0 :(得分:3)

无限循环重复时rawDataList的范围结束。旧列表被销毁。在下一次迭代中,可能会在同一堆栈槽中创建一个新的。

答案 1 :(得分:0)

我的回答是:它是关于范围界定的,本地对象在离开其范围时被破坏。 示例代码:                int x = 0;         while(x <2){         printf(“x is%d \ n”,x);         元素e1;
        X ++;

    if (2 == x){
         while(1){
            sleep(1000);//do not leave the loop
            }
        }

    }

输出(我在构造函数和析构函数中打印一些东西): x为0 构造元素 destruct〜element - 注意:它在“x为1”之前 x是1 构造元素