错误:双重免费或损坏(fasttop)

时间:2014-10-16 08:02:44

标签: c++ double free corruption

我尝试了几天才制作这个小代码,但它不起作用。我看到很多关于这个问题的问题,但我没有找到答案。

以下是Voiture.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的代码:

#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的代码:

int main()
{
cout << "(1) ***** Test du constructeur par defaut de Voiture *****" << endl;
{
Voiture voiture;
voiture.Affiche();
}
}

我没有把所有代码放在我遇到问题的地方。

谢谢! :(

1 个答案:

答案 0 :(得分:1)

一个明显的问题是您缺少用户定义的赋值运算符:

VoitChoix=Modele();

这会调用赋值运算符,而不是复制构造函数。由于您没有Modele的用户定义的赋值运算符,因此您将遇到有关VoitChoix销毁的问题。更具体地说,您要将Modele()创建的所有值分配给VoitChoix

因此,您有两个具有Nom指针值的实例。当临时Modele()超出范围时,它将调用析构函数,从而删除Nom。当VoitChoix超出范围时,它将尝试删除Nom的相同指针值。因此双重删除错误。

Modele的用户定义的赋值运算符将具有以下签名:

Modele& operator=(const Modele&);

在继续之前,您需要实现此功能。这可以使用copy/swap成语What is the copy-and-swap idiom?

轻松完成

另外,请在创建课程时遵循三条规则:What is The Rule of Three?