2014-12-02 2 views
0

tsp라는 배열에 대해 결정된 크기를 사용할 때까지 프로그램이 제대로 작동하므로 세그먼트 화 오류가 발생합니다.C 라이브러리에서 .so 라이브러리의 코어 분할

std::cout<<"point1"<<std::endl; 
vector< pair< int, float > > valores ; 
std::cout<<"point2"<<std::endl; 
cargar_vector_valores(valores, defenses); 
std::cout<<"point3"<<std::endl;    
unsigned int cost = 0; 
std::cout<<"point4"<<std::endl; 
//copiar lista de defenses a vector 
vector<Defense*> copia_defenses; 
std::cout<<"point5"<<std::endl; 
for(std::list<Defense*>::iterator it=++defenses.begin();it != defenses.end();it++){ 
    copia_defenses.push_back((*it)); 
} 
std::cout<<"point6"<<std::endl; 
std::cout<<"defenses.size()-1="<<defenses.size()-1<<std::endl; 
std::cout<<"cols = "<<ases+1<<std::endl; 
int rows=defenses.size()-1; 
int cols=ases+1; 
int tsp [rows][cols]; 
std::cout<<"point7"<<std::endl; 
selectedIDs.push_back((*defenses.begin())->id); 
std::cout<<"point8"<<std::endl; 
ases-=(*defenses.begin())->cost; 
std::cout<<"point9"<<std::endl; 

는 그리고 이것은 내가 문제가 무엇 모르는 array..I을 만들 때 코어 덤프

point1 
point2 
point3 
point4 
point5 
point6 
defenses.size()-1=165 
cols = 12769 
Segmentation fault (core dumped) 

프로그램의 밖이다.

+0

'ases'는 어디에 정의되어 있습니까? – CoryKramer

+5

처음에는 [가변 길이 배열] (https://en.wikipedia.org/wiki/Variable-length_array)은 C++ 기능이 아니며 사용중인 컴파일러의 확장 기능입니다. 둘째 스택에 8MB가 넘는 용량을 할당하려고합니다. Linux 프로세스의 기본 스택은 정확히 8MB이므로 스택에 저장된 다른 모든 변수와 호출 프레임 및 그 밖의 모든 변수를 사용하면 한계가 있습니다. –

+2

마지막으로, ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector)를 사용하지 않는 이유가 있습니까? –

답변

1

주석에서 지적한 것처럼 스택에 너무 많은 메모리를 할당하려고합니다. 165 * 12769 = 2106885 정수가 시스템에서 32 비트라고 가정하면 Linux에서 스택 크기 (일반적으로 8192 KiB, 쉘 명령 $ ulimit -s로 확인할 수 있음)를 초과하는 8230 KiB를 얻습니다. 프로그램에서 다른 변수와 모든 것을 고려하면 그 한도를 넘어 섰습니다. 대신 힙에 메모리를 할당해야합니다. 새 메모리를 사용하거나 std :: vector와 같은 std 구조체를 사용하십시오. 요아킴 Pileborg에 의해 지적

또한,

int tsp [rows][cols]; 

은 행과 COLS는 컴파일 타임에 결정되지 않기 때문에 표준 C++되지 않습니다. 귀하의 컴파일러는 variable-length array 확장을 사용하여 작동하지만, 모든 컴파일러에서 작동하지 않으므로 피해야 할 대상이됩니다.