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