为什么删除指向对象的指针会导致崩溃?

时间:2018-01-13 18:25:43

标签: c++ pointers

我有这两个课程,一个叫做Bibliotheque(英文图书馆),另一个叫Livre(书)。他们的原型如下:

#ifndef BIBLIOTHEQUE_H_INCLUDED
#define BIBLIOTHEQUE_H_INCLUDED

#include "Livre.h"
#include <string>
#include <vector>

class Bibliotheque
{
private:

int m_idBiblio;
std::string m_nom;
std::string m_adresse;
std::vector<Livre*> m_listeLivres;

public:

Bibliotheque(int idBiblio, std::string nom, std::string adresse);
~Bibliotheque();
//etc.
};

#endif // BIBLIOTHEQUE_H_INCLUDED

#ifndef LIVRE_H_INCLUDED
#define LIVRE_H_INCLUDED

#include <string>

class Bibliotheque; //forward declaration

class Livre
{
protected:

std::string m_idLivre;
//etc.
Bibliotheque *m_biblioProprietaire;
Bibliotheque *m_biblioActuelle;

public:

Livre(std::string auteur, std::string titre, std::string editeur, int isbn, 
std::string publicLivre, std::string categorie, Bibliotheque 
*biblioProprietaire);
virtual ~Livre();
//etc.
};

#endif // LIVRE_H_INCLUDED

这些类的构造函数和析构函数的定义如下所示:

Bibliotheque::Bibliotheque(int idBiblio, string nom, string adresse): 
m_idBiblio(idBiblio), m_nom(nom), m_adresse(adresse),
m_listeLivres(vector<Livre*> ())
{
}

Bibliotheque::~Bibliotheque()
{
int i;
for (i = 0; i < m_listeLivres.size(); i++)
{
    delete m_listeLivres[i];
    m_listeLivres[i] = 0;
}
}


Livre::Livre(string auteur, string titre, string editeur, int isbn, string 
publicLivre, string categorie,
Bibliotheque *biblioProprietaire)
{
biblioProprietaire->ajouterLivre(this);
m_biblioProprietaire = biblioProprietaire;
m_biblioActuelle = biblioProprietaire;
//etc.
}

Livre::~Livre()
{
}

void Bibliotheque::ajouterLivre(Livre *livre)
{
m_listeLivres.push_back(livre);
}

当我尝试从main中删除指向Livre对象的指针时,程序崩溃并且指针不会被删除。这是主要的:

#include <iostream>
#include <iomanip>
#include "Bibliotheque.h"
#include "Livre.h"
#include <string>
#include <vector>

using namespace std;

int main()
{
Bibliotheque *b1(0);
b1 = new Bibliotheque(1, "ECM", "Marseille");
Livre *l1(0);
l1 = new Livre("Machado de Assis", "Dom Casmurro", "BNC", 7031452, 
"Adultes", "Roman", b1);
delete l1;
l1 = 0;
delete b1;
b1 = 0;
return 0;
}

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您正尝试删除指针两次。首先删除l1,然后在删除b1时,析构函数会尝试删除包含l1的向量内容,但该内容已被删除。

让实例指向彼此大部分时间都是设计中某些内容错误的标志。但是,我无法帮助你,因为我真的不明白你的程序应该做什么。请随意查看here,了解为什么使用您的母语进行编程会使您的代码更难以被其他人访问。