涉及卸载的共享对象的内存泄漏?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了涉及卸载的共享对象的内存泄漏?相关的知识,希望对你有一定的参考价值。
我试图理解这个编程问题,我应该猜测数据结构。我的程序有点问题。
问题:我不清楚为什么我的程序总是被信号11(分段错误)杀死但它的工作和编译很好。
关于程序:n将是整数集的数量;它接受一个整数p(命令)和整数数据,并将/推送/弹出到以下数据结构中。我使用bool作为标志来检查状态。我是否正确地认为结构将在while循环之后被销毁,因为它超出了范围?
int main(){
int n;
while (cin >> n && n != 0){
stack<int> mystack;
queue<int> myqueue;
priority_queue<int> maxq;
bool isstack = true;
bool isqueue = true;
bool ispq = true;
for (int i = 0; i < n; i++){
int p, data;
cin >> p >> data;
if (p == 1){
if (isqueue) myqueue.push(data);
if (isstack) mystack.push(data);
if (ispq) maxq.push(data);
} else if (p == 2){
if ((mystack.empty() || mystack.top() != data) && isstack) isstack = false;
else mystack.pop();
if ((myqueue.empty() || myqueue.front() != data) && isqueue) isqueue = false;
else myqueue.pop();
if ((maxq.empty() || maxq.top() != data) && ispq) ispq = false;
else maxq.pop();
}
}
if (isstack && !(isqueue || ispq)) cout << "stack" << endl;
else if (isqueue && !(isstack || ispq)) cout << "queue" << endl;
else if (isstack && (ispq || isqueue) || (isqueue && ispq)) cout << "not sure" << endl;
else if (ispq && !(isstack || isqueue)) cout << "priority queue" << endl;
else cout << "impossible" << endl;
}
return 0;
}
答案
是的,您使用的数据结构是while的本地范围,因此它们会在while循环结束时被破坏。
除非你提供了你看到的分段错误的输入,否则很难说。或者在调试模式下运行它,程序应该在发生seg错误的行中断。
另一答案
我试着运行这段代码。
当'isstack'更改为false后弹出此代码会引发异常。
唯一的例外是'Expression:在pop之前deque empty'。
变量变为false后,始终条件语句返回false。
所以你试图弹出空堆栈。
这是一个恰到好处的逻辑错误。
以上是关于涉及卸载的共享对象的内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章
18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题
FragmentStatePagerAdapter 内存泄漏(带有 viewpager 的嵌套片段)