2012-05-18 2 views
1

저는 최근에 C++로 시작했고 포인터에 대한 개념과 배열에 대한 연결을 잘 모르겠습니다. Term과 Polynom의 두 클래스가 있습니다. 나는 사용자가 2 개의 숫자를 입력 할 수있게하는 메인 루프를 가지고있다. 그런 다음 해당 숫자가 "Term"개체에 추가되고 해당 개체가 "Polynom"개체에 추가됩니다. 루프가 실행될 때마다 새로운 "Term"객체가 생성됩니다.C++에서 포인터와 메모리 할당

//These lines are executed until the user is done entering numbers    
potens = new Term; 
potens->sattPotens(kinput, ninput);//Add values to "Term object" 
poly.addTerm(potens);//Add "Term" object to "Polynom" object 

"Polynom"개체는 프로그램에서 한 번만 생성됩니다. "Polynom"클래스에서 "Polynom"오브젝트에 추가 된 모든 "Term"오브젝트를 저장하기 위해 "Term"포인터를 사용합니다. "Polynom"클래스의 "Term"포인터는 "Polynom"생성자에서 한 번 시작됩니다.

void Polynom::addTerm(Term *t){ 
     *(term+antal_termer) = *t;//This is were the program crashes 
     antal_termer++; 
} 

내가 내가 "기간"개체를 저장하는 포인터 대신 벡터를 사용할 수 있습니다 알고 있지만 내가 어떻게 포인터 일을 배우려고 노력하고있다. 또한 메인 루프에서 생성 된 객체를 삭제해야 할 때도 확신 할 수 없습니다. 루프가 실행될 때마다 새로운 "용어"개체가 만들어 지지만 절대로 삭제하지 않습니다.

편집 : "Polynom"클래스에 "Term"개체를이 방법으로 할당했습니다. term = new Term []; 나는 term = new Term으로 변경했다. 하지만 용어를 실행할 때 여전히 충돌합니다 [antal_termer] = * t;

+0

당신은 term''의'Polynom' 생성자 및 정의를 표시 할 수 있습니다. – hmjd

+0

'antal_termer'가 생성자에서 초기화 되었습니까? 또한'AddTerm()'에 10 개 이상의'Term' 객체를 저장하지 못하게해야합니다. – hmjd

+0

생성자에 antal_termer = 0을 추가했는데 감사합니다.나는 객체가 생성 될 때 모든 변수가 자동으로 0으로 초기화되었다고 생각 했습니까? – user1163392

답변

0

코멘트의 결과 붙여 넣기.

antal_termer 여기에 잘못된 메모리 액세스의 결과로, 생성자에서 초기화되지 않은 : 코드 t를 복사하는

*(term+antal_termer) = *t; 

으로, 과제를 통해 수행 할 수 있습니다 delete potens;addTerm() 호출 후. 코드 그렇지 않으면 또 다른 잘못된 메모리 액세스가 발생, addTerm()에서 term 배열의 끝을 넘어 방지해야합니다

void Polynom::addTerm(Term *t){ 
     if (antal_termer < 10) // Use constant instead of literal 10 
     { 
      *(term+antal_termer) = *t; 
      antal_termer++; 
     } 
} 
1
*(term+antal_termer) = *t;//This is were the program crashes 
antal_termer++; 

메모리가 부족하기 때문에 충돌이 발생합니다. 가장 좋은 방법은 동적 배열 대신 std::vector을 사용하는 것입니다.

용어는 term = new Term; 또는 term = new Term[sz];입니까?

첫 번째 객체 인 경우 하나의 객체 만 저장할 수 있으며 term+antal_termer은 그 이상입니다. 두 번째 인 경우 antal_termer >= sz 인 경우 문제가 발생합니다. 내가 객체가 아닌 포인터를 사용하고

std::vector<Term> terms; 
Term potens; //why use new? 
terms.push_back(potens); 

참고 :

std::vector 옵션은 당신에게 자동 관리 기능을 제공합니다. 포인터의 경우,

std::vector<Term*> terms; 
Term* potens = new Term; 
terms.push_back(potens); 

그러나 완료 한 후에는 메모리를 삭제해야합니다.

+0

나는 term = new Term을 사용한다. 그러나 만약 내가 (용어 + 1) = * t를하면 이해할 수 있듯이 * t의 값은 단순히 용어에 의해 할당 된 메모리 셀 옆의 메모리 셀에 저장됩니까? 내가 그렇게했을 때 몇 번 일했습니다. – user1163392

+0

@ user1163392'term '은 어떻게 할당 했습니까? 다음 메모리 셀이 실제로 존재합니까? 충분한 메모리를 할당하고 있습니까? –

+0

흠, 내가 할 경우 term = new Term [10]; "Polynom"생성자에서 프로그램은 처음으로 용어를 충돌시킵니다 [antal_termer] = * t; 실행됩니다. antal_termer = 0 처음으로. – user1163392