2013-04-24 5 views
1

3D 벡터 작업을하고 있었는데 모든 것이 완벽하게 작동했습니다. 내가 ofstream 파일을 추가하고 작업했을 때 Segmentation Fault가 나타났습니다. 나는이 문제를 전혀 이해하지 못한다. 다음 코드는 작동하지 않습니다C++ 세그먼트 작업 오류시 <vector> 및 <fstream>

#include <iostream> 
#include <vector> 
#include <fstream> 

std::vector < std::vector < std::vector <float> > > hand; 


int main(){ 

//First Part 
std::ofstream file; 
file.open("test.csv"); 
file << "Hello World!"; 
file.close(); 

//Second Part 
hand.reserve(20); 
for (int i=0; i<hand.capacity(); i++){ 
    hand[i].reserve(4); 
} 

return 0; 
} 

당신이 코드가 완벽하게 작동 부품 중 하나를 언급합니다. Segmentation 오류는 동시에 작업하려고 할 때 나타납니다.

hand.reserve(20); 

우리가 8 이하의 번호를 사용 :

hand.reserve(7); //or lower 

내 질문은 왜 코드가 작동하지

대신의 경우 코드가 작동 할 수 있음을주의하는 것도 중요하다 내가 그들을 동시에 사용할 때? 문제를 해결하려면 어떻게해야합니까? 이 사건에 대한 설명이 있습니까?

이 코드를 훨씬 더 큰 코드로 구현해야하므로, 근본 원인을 알고 다음 번에이를 피하는 것이 좋습니다.

+0

이 응용 프로그램을 디버깅 할 수 있습니다 및 0 값을보고하는 resize(20)를 사용해야합니까? –

답변

5

변경

hand.reserve(20); 

hand.resize(20); 

reserve에게만 실제 객체를 생성하지 않고, 데이터를 저장하는 벡터 용량을 변경한다. 따라서 reserve을 사용하면 빈 벡터가 생겨 재 할당없이 20 개의 새 값을 받아 들일 수 있습니다. capacity()size()과 같지 않습니다. 벡터가 이미 메모리를 할당 한 요소의 양을 반환하며 실제 요소 수를 반환하는 size()보다 클 수 있습니다.

1

reserve은 실제 크기가 아니라 벡터의 용량 만 늘립니다.

그러나 루프에서 hand[i]을 수행하면 실제로 크기가 조정 된 것처럼 벡터의 항목에 액세스하지만 실제로는 해당 항목이 아직 존재하지 않습니다. 따라서 segfault.

첫 번째 reserve 전화를 resize (다른 후속 reserve 전화도)로 바꿀 수 있습니다.

2

공간을 예약했기 때문에 요소 (예 : hand[i].)를 사용할 수 없습니다. 아직 구성되지 않았습니다. 당신은뿐만 아니라 메모리를 요청뿐만 아니라 hand의 요소를 초기화, 그 후에 당신은 reserve 또는 resize 포함 된 컨테이너가 ....