2013-09-28 2 views
-1

다형성 운동으로 은행 시뮬레이션을 프로그래밍하고 있지만 메모리 오류가 발생합니다. 각 벡터의 첫 번째 항목을 malloc 할 수 있지만 함수 중 하나를 호출하면 프로그램이 충돌합니다. 1 이외의 항목을 malloc하려고하면 동일하게 발생합니다.메모리 오류를 찾을 수 없습니다

int main(){ 
ContaPoupanca *contasp; 
ContaCorrente *contasc; 
int k = 0; 
int ncp = 3; 
int ncc = 3; 
(...) 
    switch(k){ 
     case 1: { 
      int asd; 
      std::string nome_titular; 
      int n_conta; 
      std::cout<<"\n 1 - Corrente \n 2 - Poupança"; 
      std::cin >> asd; 
      std::cout<<"\nNome do Titular: "; 
      std::cin>> nome_titular; 
      if(asd == 1){ 
       std::cout<<"nº de aplicações: (max 5)\n"; 
       std::cin>>asd; 
       if(asd>5) asd=5; 
       if(asd<0) asd=0; 
        ncc++; 
        n_conta = ncc + 2501000 - 1; 
        contasc = (ContaCorrente*) malloc(ncc*sizeof(ContaCorrente)); 
        contasc[ncc-1] = ContaCorrente(nome_titular,n_conta,1.07,0,asd); 
      }else{ 
      ncp++; 
      n_conta = ncp + 2502000 - 1; 
      contasp = (ContaPoupanca*) malloc(ncp*sizeof(ContaPoupanca)); 
      contasp[ncp-1] = ContaPoupanca(nome_titular,n_conta,1.05,0); 
      } 
      std::cout<<"\nConta criada com sucesso.\n O nº da conta é "<<n_conta<<"\n"; 
      break; 
     (...) 
     case 6: {break;} 
     } 
    }while(k!=6); 
free(contasc); 
free(contasp); 
return 0; 

}

+3

C++을 사용하는 경우 기본적으로 'malloc'을 사용할 필요가 없습니다. 대신 적절한 컨테이너 (예 :'std :: vector')를 사용하십시오. –

+2

또한 수백 줄의 코드를 덤프하지 마십시오. 문제를 일으키는 * 가장 작은 * 프로그램을 찾아서 대신 게시해야합니다. –

답변

3

는 C++ 객체에의 malloc 또는 무료를 사용하지 마십시오 (NCP 또는 malloc에 ​​캐스트 1> NCC). new를 사용하고 대신 delete를 사용하십시오.

malloc은 생성자를 호출하지 않으므로 free는 소멸자를 호출하지 않습니다. 그것이 당신이 충돌을 일으키는 이유입니다. 새롭고 삭제하십시오.

+0

감사합니다. 올리 (Oli)가 충분히 다뤘으므로 이제 벡터를 사용하여 코드를 다시 작성했습니다. 감사합니다. . –

관련 문제