【问题标题】:Memory leak involving an unloaded shared object?涉及卸载的共享对象的内存泄漏?
【发布时间】:2018-03-02 05:17:04
【问题描述】:

我试图理解这个编程问题,我应该猜测数据结构。我的程序有一点小问题。

问题:我不知道为什么我的程序总是被信号 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;
}

【问题讨论】:

  • 在调试器中运行它。它应该在段错误处停止。
  • 你需要设置 LD_LIBRARY_PATH 让 Valgrind 知道你的库在哪里,这样 valgrind 才能给出完整的堆栈跟踪。

标签: c++11 data-structures segmentation-fault abstract-data-type


【解决方案1】:

是的,您使用的数据结构是 while 的本地范围,因此它们在 while 循环结束时被破坏。

除非您提供您看到的分段错误的输入,否则很难说。或者在调试模式下运行它,您的程序应该在发生段错误的行处中断。

【讨论】:

    【解决方案2】:

    我试图运行这段代码。

    当您在“isstack”更改为 false 后弹出时,此代码引发了异常。

    例外是'Expression: deque empty before pop'。

    变量变为假后,条件语句总是返回假。

    所以你试图从空堆栈弹出。

    这是一个合乎逻辑的错误。

    【讨论】:

    • 这不能作为答案。
    • 我将 'isstack' 更改为 false 后没有弹出。它是一个条件 if-else,认为你错过了一行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多