我有一个进程在执行程序后立即被杀死。这是已编译的可执行文件的代码,它是一个小程序,它读取由标准输入(通常是描述性文件)中的数字表示的多个图形,并使用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,这是我第一次遇到这种类型的错误。该程序应该在从输入中连续读取两个零后停止,我可以保证我的图形描述文件中有。即使我执行程序而没有对我的图形文件进行输入重定向,问题也会发生。
答案 0 :(得分: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位(假设您有足够的内存),解决方案是在运行时分配所有内容。
答案 1 :(得分:6)
您的数组G
和solucion
每个都包含400,000,000个整数,大多数机器上的整数大约为1.6 GiB。除非你有足够的(虚拟)内存(3.2 GiB和计数),并且允许使用它(尝试ulimit -d
;这对于MacOS X 10.7.2上的bash
是正确的),你的进程将会失败开始并将被SIGKILL杀死(不能被困,而不是过程真的要进行)。