이 작은 코드를 작성하기 위해 며칠이 지나도 시도하지만 작동하지 않습니다. 나는이 문제에 관해 많은 질문을하지만 나는 내 대답을 찾지 못했다.오류 : 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();
이것은 생성자를 복사하지, 할당 연산자를 호출합니다. :(
를, 그래서 우리는 최소한의 데이터 유형을 볼 수 있습니다 수업의 데이터 멤버. – antred
I * think * 코드에서 문제 (또는 적어도 하나의 문제)를 발견했습니다. 귀하의 Modele 클래스의 복사 생성자에서, 당신은 새 인스턴스의 Nom 포인터에 소스 인스턴스의 Nom 포인터 값을 할당합니다 (적어도 당신의 setNom 메서드가하는 일임). 그런 다음 원본 인스턴스와 새 인스턴스의 Nom 포인터는 동일한 배열을 가리키며 파괴되면 동일한 배열을 삭제하려고 시도합니다. 동적으로 할당 된 문자 배열을 사용하는 대신 std :: string 유형의 Nom 멤버를 만들어이 문제를 해결할 수 있습니다. – antred
코드가 올바르게 들여 쓰기되도록 편집하십시오. 모든 것이 왼쪽 여백으로 플러시되어 코드를 읽기 어렵게 만듭니다. – PaulMcKenzie