2014-10-16 3 views
-4

이 작은 코드를 작성하기 위해 며칠이 지나도 시도하지만 작동하지 않습니다. 나는이 문제에 관해 많은 질문을하지만 나는 내 대답을 찾지 못했다.오류 : double free 또는 corruption (fasttop)

int main() 
{ 
cout << "(1) ***** Test du constructeur par defaut de Voiture *****" << endl; 
{ 
Voiture voiture; 
voiture.Affiche(); 
} 
} 
: 여기
#include <iostream> 
#include <string.h> 
using namespace std; 
#include "modele.h" 

Modele::Modele() 
{ 
Nom=NULL; 
setNom("Default"); 
Puissance=0; 
Diesel=true; 
PrixDeBase=0; 
cout << "COnstructeur default" << endl; 
} 
Modele::Modele(const char* N,const int P,const bool D,const float PDB) 
{ 
Nom=NULL; 
setNom(N); 
setPuissance(P); 
setDiesel(D); 
setPrixDeBase(PDB); 
cout << "COnstructeur initialisation" << endl; 
} 
Modele::Modele(const Modele& M) 
{ 
Nom=NULL; 
setNom(M.getNom()); 
setPuissance(M.getPuissance()); 
setDiesel(M.isDiesel()); 
setPrixDeBase(M.getPrixDeBase()); 
cout << "COnstructeur copie" << endl; 
} 

Modele::~Modele() 
{ 
if(Nom) 
{ 
    cout << "Modele: Destruction de" << Nom << endl; 
    delete [] Nom; 
} 
} 

가 MAIN.CPP위한 코드이다 : 여기
#include <iostream> 
using namespace std; 
#include <string.h> 
#include "modele.h" 

Voiture::Voiture() 
{ 
Nom=NULL; 
setNom("Default"); 
VoitChoix=Modele(); 
cout << "COnstructeur default" << endl; 
} 

Voiture::Voiture(const char* N,const Modele V) 
{ 
Nom=NULL; 
setNom(N); 
setModele(V); 
cout << "COnstructeur initialisation" << endl; 
} 

Voiture::Voiture(const Voiture& V) 
{ 
Nom=NULL; 
setNom(V.getNom()); 
setModele(V.getModele()); 
cout << "COnstructeur copie" << endl; 
} 
Voiture::~Voiture() 
{ 
if(Nom) 
{ 
    cout << "Voiture : Destruction de" << Nom << endl; 
    delete [] Nom; 
} 
}  

가 Modele.cpp위한 코드이다 : 여기

는 Voiture.cpp위한 코드

나는 문제가있는 모든 코드를 넣지 않습니다.

감사합니다. 당신은 사용자 정의 할당 연산자가 없기 때문에

VoitChoix=Modele(); 

이것은 생성자를 복사하지, 할당 연산자를 호출합니다. :(

+0

를, 그래서 우리는 최소한의 데이터 유형을 볼 수 있습니다 수업의 데이터 멤버. – antred

+0

I * think * 코드에서 문제 (또는 적어도 하나의 문제)를 발견했습니다. 귀하의 Modele 클래스의 복사 생성자에서, 당신은 새 인스턴스의 Nom 포인터에 소스 인스턴스의 Nom 포인터 값을 할당합니다 (적어도 당신의 setNom 메서드가하는 일임). 그런 다음 원본 인스턴스와 새 인스턴스의 Nom 포인터는 동일한 배열을 가리키며 파괴되면 동일한 배열을 삭제하려고 시도합니다. 동적으로 할당 된 문자 배열을 사용하는 대신 std :: string 유형의 Nom 멤버를 만들어이 문제를 해결할 수 있습니다. – antred

+0

코드가 올바르게 들여 쓰기되도록 편집하십시오. 모든 것이 왼쪽 여백으로 플러시되어 코드를 읽기 어렵게 만듭니다. – PaulMcKenzie

답변

1

하나의 명백한 문제는 당신이 사용자 정의 할당 연산자를 놓치고 있다는 것입니다 Modele를 들어, 다음 VoitChoix의 파괴에 문제가있을 것입니다.보다 구체적으로는, 당신이 Modele()VoitChoix에 만든 모든 값을 할당한다.

을 그래서 당신은 Nom에 대해 동일한 포인터 값이 두 개의 인스턴스가 있습니다. 때 티 임시 Modele()이 범위를 벗어나면 소멸자가 호출되어 Nom이 삭제됩니다. VoitChoix이 범위를 벗어나면 Nom에 대한 동일한 포인터 값을 삭제하려고 시도합니다. 따라서 이중 삭제 오류.

Modele의 사용자 정의 할당 연산자는 다음과 같은 서명을 할 것이다 :

Modele& operator=(const Modele&); 

당신은 더 진행하기 전에이 기능을 구현해야합니다. 클래스 만들 때 What is the copy-and-swap idiom? 또한

은 세 가지의 규칙을 따르십시오 :이 copy/swap 관용구 사용하여 쉽게 수행 할 수 있습니다 당신은 또한 클래스 정의를 제공해야 What is The Rule of Three?

+0

답장을 보내 주셔서 감사합니다. –

관련 문제