c – SIGKILL的杀戮过程

c – SIGKILL的杀戮过程,第1张

概述我有一个进程在执行程序后立即被杀死.这是已编译的可执行文件的代码,它是一个小程序,它读取由标准输入(通常是描述性文件)中的数字表示的多个图形,并使用Prim算法找到每个图形的最小生成树(它不显示结果,它只是找到解决方案). #include <stdlib.h> #include <iostream> using namespace std;const int MAX_NODOS = 我有一个进程在执行程序后立即被杀死.这是已编译的可执行文件的代码,它是一个小程序,它读取由标准输入(通常是描述性文件)中的数字表示的多个图形,并使用Prim算法找到每个图形的最小生成树(它不显示结果,它只是找到解决方案).
#include <stdlib.h>  #include <iostream>  using namespace std;const int MAX_NodoS = 20000;const int infinito = 10000;int nnodos;int nAristas;int G[MAX_NodoS][MAX_NodoS]; int solucion[MAX_NodoS][MAX_NodoS];int menorCoste[MAX_NodoS];int masCercano[MAX_NodoS];voID leeGrafo(){    if (nnodos<0 || nnodos>MAX_NodoS) {        cerr << "Numero de nodos (" << nnodos << ") no valIDo\n";        exit(0);    }      for (int i=0; i<nnodos ; i++)        for (int j=0; j<nnodos ; j++)            G[i][j] = infinito;     int A,B,P;    for(int i=0;i<nAristas;i++){        cin >> A >> B >> P;         G[A][B] = P;        G[B][A] = P;    }   }voID prepararEstructuras(){    // Grafo de salIDa    for(int i=0;i<nnodos;i++)        for(int j=0;j<nnodos;j++)            solucion[i][j] = infinito;    // el mas cercaano     for(int i=1;i<nnodos;i++){        masCercano[i]=0;        // menor coste        menorCoste[i]=G[0][i];    }           }voID prim(){    prepararEstructuras();    int min,k;      for(int i=1;i<nnodos;i++){        min = menorCoste[1];        k = 1;        for(int j=2;i<nnodos;j++){            if(menorCoste[j] < min){                min = menorCoste[j];                k = j;            }        }        solucion[k][masCercano[k]] = G[k][masCercano[k]];        menorCoste[k] = infinito;        for(int j=1;j<nnodos;j++){            if(G[k][j] < menorCoste[j] && menorCoste[j]!=infinito){                menorCoste[j] = G[k][j];                masCercano[j] = k;            }               }               }}voID output(){    for(int i=0;i<nnodos;i++){        for(int j=0;j<nnodos;j++)            cout << G[i][j] << ' ';        cout << endl;    }}int main (){    while(true){        cin >> nnodos;        cin >> nAristas;        if((nnodos==0)&&(nAristas==0)) break;        else{            leeGrafo();            output();            prim();         }    }   }

我已经知道我必须使用strace来查找正在发生的事情,这就是我得到的:

execve("./412",["./412"],[/* 38 vars */] <unfinished ...>+++ killed by SIGKILL +++Killed

我正在运行ubuntu,这是我第一次遇到这种类型的错误.该程序应该在从输入中连续读取两个零后停止,我可以保证我的图形描述文件中有.即使我执行程序而没有对我的图形文件进行输入重定向,问题也会发生.

解决方法 虽然我不是100%确定这是问题所在,但请看一下全局数组的大小:
const int MAX_NodoS = 20000;int G[MAX_NodoS][MAX_NodoS]; int solucion[MAX_NodoS][MAX_NodoS];

假设int是4个字节,您将需要:

20000 * 20000 * 4 bytes * 2 = ~3.2 GB

首先,你甚至可能没有那么多记忆.其次,如果你使用的是32位,那么 *** 作系统很可能不允许单个进程拥有那么多内存.

假设您使用64位(假设您有足够的内存),解决方案是在运行时分配它.

总结

以上是内存溢出为你收集整理的c – SIGKILL的杀戮过程全部内容,希望文章能够帮你解决c – SIGKILL的杀戮过程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1235365.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存