2013-02-19 2 views
0

Objective-C/C에서 오는 C++을 배우고 있으며 더미 프로젝트의 경우 Mac OS X 컴퓨터에 저장된 /usr/share/dict/words 파일의 단어를로드하려고합니다.문자열의 C++ 동적 배열

파일을로드하고 각 단어를 배열로 가져 오는 것이므로 유형의 array이 있습니다.

하지만 배열에 동적 메모리가 올바르게 작동하는 데 문제가 있습니다. newdelete을 사용하고 있습니다. 누군가가 도와 수 있다면 ...,

를 아래 코드의 일부를 추가 한 그래서 내가 메모리 오류 받고 있어요 :

word:: A 
word:: a 
word:: aa 
word:: aal 
definitions(2758) malloc: *** error for object 0x100103b90: incorrect 
checksum for freed object - object was 
probably modified after being freed. 
*** set a breakpoint in malloc_error_break to debug 

로드 단어 :

string* Definition::loadWords() 
{ 
    int arrayLength = 0; 

    arrayOfWords = new string[arrayLength]; 

    ifstream file; 

    file.open("/usr/share/dict/words"); 

    if(file.is_open()) 
    { 
     while(file.good()){ 
      string word; 
      getline(file, word); 
      this->addWord(word, arrayOfWords, &arrayLength); 
     } 

    } 

    file.close(); 

    cout << endl << "There are " << arrayLength << " words" << endl; 

    return arrayOfWords; 
}; 

추가

void Definition::addWord(string newWord, string currentArray[], int* arrayLength) 
{ 
    cout << endl << "word:: " << newWord; 

    string *placeholderArray = new string[*arrayLength + 1]; 
    placeholderArray[*arrayLength + 1] = newWord; 

    for(int i = 0; i < *arrayLength; i++){ 
     placeholderArray[i] = currentArray[i]; 
    } 

    (*arrayLength)++; 

    currentArray = placeholderArray; 

    delete [] placeholderArray; 
} 
+0

스위치 :

여기 벡터를 사용하기위한 가이드이다. –

답변

1

우선은 이것이다 :

placeholderArray[*arrayLength + 1] = newWord; 

당신은 배열의 끝을지나 요소를 추가하고 있습니다. 당신이 당신의 배열을 삭제하는 그 이후 그런

placeholderArray[*arrayLength] = newWord; 

: 배열의 길이가 5 다음 배열의 마지막 요소는 그래서 라인이 있어야한다 인덱스 (4)에있을 경우, 배열은 예를 들어 0부터 색인 :

currentArray = placeholderArray; 

delete [] placeholderArray; 

currentArray를 placeholderArray를 가리킨 다음 삭제하면됩니다.

또한 참조로 전달하는 것이 포인터로 전달하는 것보다 훨씬 효율적입니다.그래서 오히려 이보다 :

void Definition::addWord(string newWord, string currentArray[], int* arrayLength) 

사용이 :

void Definition::addWord(string newWord, string currentArray[], int& arrayLength) 

항상 사용하지 않아도 그 * 값을 당신이 그것을 사용할 때마다 얻을 수 있습니다.

여기에 사용 참조에 대한 자습서의 : http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

또한 자신에게 시간과 노력을 절약하고 벡터와 STL 컨테이너가 아닌 배열 조만간 사용하는 방법에 대해 알아보세요. 벡터를 사용하는 대신에 직접 동적 메모리를 사용하는 http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4027/C-Tutorial-A-Beginners-Guide-to-stdvector-Part-1.htm

+0

안녕하세요, 첫 번째 관찰에 대해 감사합니다, arrayLength + 1 이전 배열에서 사용하고 있습니다. 이미 +1 요소가있는 새 배열을 만들었습니다. 아이디어는 전에 새 단어를 넣는 것이 었습니다. 이전 배열 단어를 0에서 n - 1로 복사합니다. 참조 포인터와 포인터에 대해 지적 해 주셔서 감사합니다. – user2085476

+0

프로그램을 단계별로 실행하면 내가 말하는 것을 보게됩니다. arrayLength가 0에서 시작하면 arrayLength로 0을 전달하는 문자열을 추가합니다. 배열 lengthLength + 1 (1)을 만든 다음 arrayLength + 1 (1)에 요소를 추가합니다. 즉, 배열의 끝을 넘어 요소를 추가했습니다. 따라서 길이 1의 배열을 만들고 인덱스 0에 요소를 추가해야합니다. –

+0

사실, David는 거기에 맞습니다. 예를 들어, 처음 메서드가 호출되면 array [1]을 생성합니다. 그런 다음 범위를 벗어나는 array [1] 값을 설정합니다. –

1
currentArray = placeholderArray; 

이를 : 배열 단어 placeholderArray를 currentArray에 별칭 지정합니다. 그래서 전화 할 때 ...

delete [] placeholderArray; 

.. 당신은 currentArray가 가리키고있는 것을 삭제합니다. 배열의 값에 반대 여기

+0

그래서 내가하고있는 일은 그것을 지우는 것이 아니라 여전히 충돌이 있으며 메모리가 부족합니다. – user2085476

+0

이 방법으로 동적 배열을 사용해야합니까? 벡터를 사용할 수 있다면 더 쉬울 것입니다. –

+0

할당이 없습니다. 실제로 동적 메모리를 마스터하려고합니다. 이것이 바로이 벡터 솔루션이 지금 당장 나를 위해 흥미롭지 않은 이유입니다. – user2085476

1

당신은 단순히 포인터를 할당됩니다

currentArray = placeholderArray; 

그리고 여기 당신은 공간이 지적 자유에 의해 상기 포인터 :

delete [] placeholderArray; 

다음에 해제 된 메모리 공간에서 읽을 때 정의되지 않은 동작이 발생합니다. 대신, std::vector하고 resize() 기능을 사용하여 C++에서 C 스타일 배열을 사용


. 더 나아가 애플리케이션은 각 newWord에서 push_back()을 호출하기 만하면 addWord() 기능의 필요성이 모두 제거됩니다. 내가 볼 수