2012-01-02 254 views
6

我有一个进程在执行程序后立即死亡。这是编译的可执行文件的代码,它是一个小程序,它读取由标准输入(通常为描述性文件)中的数字表示的多个图形,并使用Prim算法为每个图形找到最小生成树(它不显示结果呢,它只是找到解决方案)。SIGKILL杀死进程

#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的,这是我第一次得到这个类型的错误。该程序应该从输入中读取连续两个零后停止,这可以保证我在图形描述文件中有。此外,即使我执行程序时未执行输入重定向到我的图形文件,也会出现问题。

+0

您的程序逻辑非常难以遵循。你的调试器对这种情况说了什么? – 2012-01-02 01:50:37

+3

需要注意的事项:固定大小的阵列非常庞大。启动时,您需要>'3.2 GB' ...这可能是问题。 – Mysticial 2012-01-02 01:52:00

+0

@ TomalakGeret'kal:程序逻辑不相关;它们都没有执行! – Gabe 2012-01-02 01:52:44

回答

8

虽然我不是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位(并假设你有足够的内存),解决方案将是在运行时分配所有内存。

+0

这可能是答案。我建议将这些'int'数组更改为'short'来查看是否有帮助。 – Gabe 2012-01-02 01:59:05

+0

我现在可以看到,这是我遇到的问题,我只是将2000更改为20,它的工作原理。还有一个问题,如果我想继续使用数组的图表表示而不改变列表的替代,我可以使用指针int?而不仅仅是int。它会解决问题吗?或者我必须改变成一个动态结构所必需的? – 2012-01-02 02:02:24

+0

如果你不小心,指针会占用更多的空间,从而加剧问题。你可能根本没有足够的内存可用。你在32位或64位机器上?如果在32位上,则可能无法执行大小为20,000的问题(因为数据的总大小太接近4 GiB)。如果您使用的是64位,则取决于您的虚拟内存限制,而不是CPU寻址的限制。 – 2012-01-02 02:05:20

6

您的阵列Gsolucion每个都包含400,000,000个整数,在大多数机器上每个整数大约为1.6 GiB。除非您有足够(虚拟)的内存(3.2 GiB和计数)以及使用它的权限(尝试ulimit -d; MacOS X 10.7.2上的bash正确),否则您的进程将无法启动并将被SIGKILL杀死(这不能被困住,并不是这个过程真的到了)。