2010-12-14 4 views
0

저는 C++ 프로그래밍을 처음 접했을뿐 아니라 사소한 문제 일 수도 있지만 클래스에 가변 크기의 배열을 만들고 텍스트 파일 데이터를이 클래스로 전송해야합니다 (아래 참조). 내가 통해 메인 프로그램에서 정보에 접근하려고하지만 경우 여기 HISTORYFile >> ClusterCoord[i];클래스의 동적 메모리 배열 초기화

cout << CoordClassExample.ClusterCoord[1] << "\n"; 

내가 버스 오류, 정보의 벌금이 걸릴 것으로 보인다. 할 수 있으면 도와주세요! 당신은 두 번 함수를 호출하는 경우 당신이 어딘가에 리소스를 해제하지 않는 한

class CoordClass{ 
public: 
    int Entries; 
    double * ClusterCoord; 
    void set_valuesCoord(ifstream &HISTORYFile,int MolAtomNum, int MolNum); 
}; 

void CoordClass::set_valuesCoord(ifstream& HISTORYFile,int MolAtomNum, int MolNum) { 
    Entries=MolAtomNum*MolNum; 
    double *ClusterCoord = new double [Entries]; 

    for (int i=0;i<Entries;i++) { 
     HISTORYFile.ignore(1000,'\n');  
      HISTORYFile >> ClusterCoord[i]; 
     cout << ClusterCoord[i] << "\n"; 
      HISTORYFile.ignore(1000,'\n'); 
    } 
} 
+1

당신이 C++의 새로운면, [좋은 C++ 책을 선택]하십시오 (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) 그것을 통해 읽으십시오. 원시 배열 대신에'std :: vector '을 사용해야합니다. 나는'set_valuesCoord()'함수에서 메모리 누수를 이미 볼 수있다. –

+0

코드에 많은 문제가 있습니다. @In silico가 준 책 링크를 참조하십시오. –

+0

그래, 아마 내가 비행 중 포트란에서 쓴 프로그램을 다시 만들려고 노력해야한다. 당신이 나에게 무엇을 검색 할 지 알려주지 만 도움이 될 것입니다. 그리고 메모리 누수 라인을 강조 표시하십시오. –

답변

1

당신은 set_valuesCoord() 기능에 누수가. 그것은 이 아니고 문제이지만 문제입니다. std::vector<>을 사용하십시오. 문제가 무엇인지

class CoordClass { 
    // ... 
    std::vector<double> ClusterCoord; // instead of double *ClusterCoord 
    // ... 
}; 

당신이 double가 제대로 구문 분석 여부를 확인하지 않는다는 것입니다. 그렇지 않은 경우 초기화되지 않은 메모리에 액세스하고 있으며 이로 인해 정의되지 않은 동작이 발생합니다.

또한 변경 항목을 제거하고 ClusterCoord.size()을 사용하는 것입니다 : 다른 것들 사이에 누출되지 않습니다 vector 방법을 보여주는 연습으로

void CoordClass::set_valuesCoord(...) 
{ 
    // ... 
    double cluster_coord = 0; 
    if(HISTORYFile >> cluster_coord) 
     ClusterCoord.push_back(cluster_coord); 
    else 
     std::cerr << "Error parsing cluster coord.\n"; 
    // ... 
} 
+0

팁 주셔서 감사합니다. double은 확실히 구문 분석을 올바르게 수행했으며 배열의 크기를 미리 고정하여 실행했습니다. –

+0

함수에 동적 배열 크기를 할당하는 것에 근본적으로 잘못된 점이 있습니까? –

+0

오케이, 나는 멍청 아, 시간 낭비에 대해 유감스럽게 생각했다 : ClusterCoord = new double [Entries]; –

1

.

class CoordClass{ 
public: 
    int Entries; 
    std::vector<double> ClusterCoord; 
    void set_valuesCoord(ifstream &HISTORYFile,int MolAtomNum, int MolNum); 
}; 

void CoordClass::set_valuesCoord(ifstream& HISTORYFile,int MolAtomNum, int MolNum) { 
    Entries=MolAtomNum*MolNum; 
    ClusterCoord.resize(Entries); 

    for (int i=0;i<Entries;i++) { 
     HISTORYFile.ignore(1000,'\n');  
      HISTORYFile >> ClusterCoord[i]; 
     cout << ClusterCoord[i] << "\n"; 
      HISTORYFile.ignore(1000,'\n'); 
    } 
} 
+0

이것은 이전에 벡터를 크기를 조정할 때 더 좋은 대답입니다 (+1). 따라서 이전 예에서 발생한 메모리 할당 및 복사에 대한 패널티가 발생하지 않습니다.메모리 누수 외에, 클래스의 소멸자에서 ClusterCoord가 삭제되지 않으면 버스 오류의 원인이 표시되지 않습니다. 놀랍게도 나는 이것에 대한 답장을 보지 못했다. 감사 – cppcoder