Salve a tutti. Ho cercato nel forum possibili soluzioni per il mio problema ma non ne sono ancora venuto a capo, per cui chiedo il vostro aiuto.

Questi sono i file che ho creato:

codice:
//File distributore.h

#ifndef DISTRIBUTORE_H
#define DISTRIBUTORE_H

#include <string>
#include <vector>
#include <cassert>
#include <iostream>
#include <algorithm>

using namespace std;

class Film
{
friend ostream& operator<<(ostream& os, const Film& f);
public:
	Film(string t, string r, unsigned a);
	string Titolo() const {return titolo;}
	string Regista() const {return regista;}
	unsigned Anno() const {return anno;}
	
	Film* TrovaOriginale() const {return originale;}
	void AggiornaCatalogo(unsigned c) {catalogo.first += c; catalogo.second += c;}
	void UscitaFilm() {catalogo.second--;}
	void RitornaFilm() {catalogo.second++;}
	void FissaOriginale(Film* f);
	
	bool operator==(const Film& f) const {return titolo == f.titolo && regista == f.regista;}
	pair<unsigned, unsigned> CopieFilm() const {return catalogo;}
private:
	string titolo, regista;
	unsigned anno;
	Film* originale;
	bool remake;
	pair<unsigned,unsigned> catalogo; //catalogo.first = copie_totali, catalogo.second = copie_presenti
};

class Distributore
{
friend ostream& operator<<(ostream& os, const Distributore& d);
public:
	Distributore(string n) {nome = n;}
	string Nome() const {return nome;}
	
	Film* VediFilm(unsigned i) const {return films[i];}
	int NumFilm() const {return films.size();}
	void InserisciFilm(Film* f, unsigned c);
	void EliminaFilm(Film* f);
	void EsceFilm(Film* f);
	void RitornaFilm(Film* f);
	
	pair<unsigned, unsigned> CopieFilm(Film* f);
	vector<Film*> ListaFilmPerAnno(unsigned a);
	vector<Film*> ListaRemake();
private:
	string nome;
	vector<Film*> films;
	int TrovaFilm(Film*);
};

#endif
codice:
//File distributore.cpp

#include "distributore.h"

Film::Film(string t, string r, unsigned a) : titolo(t)
{
	regista = r;
	anno = a;
}

void Film::FissaOriginale(Film* f)
{
	(*this).remake = true;
	(*this).originale = f;
	(*f).remake = false;
}

int Distributore::TrovaFilm(Film* f)
{
	for (unsigned i = 0; i < films.size(); i++)
		if (films[i] == f)
			return i;
	return -1;
}

void Distributore::InserisciFilm(Film* f, unsigned c)
{
	int indice = TrovaFilm(f);
	if (indice != -1)
		f -> AggiornaCatalogo(c);
	else
	{
		films.push_back(f);
		f -> AggiornaCatalogo(c);
	}
}

pair<unsigned,unsigned> Distributore::CopieFilm(Film* f)			// da rivedere!!!
{
	pair <unsigned,unsigned> copie_film = (f -> CopieFilm());

	return copie_film;
}

void Distributore::EliminaFilm(Film* f)
{
	int indice = TrovaFilm(f);
	pair <unsigned,unsigned> copie = (CopieFilm(f));
	
	assert (indice != -1);
	assert (copie.first == copie.second);
	
	films.erase(films.begin() + indice);
}

void Distributore::EsceFilm(Film* f)
{
	assert (TrovaFilm(f) != -1);
	pair <unsigned,unsigned> copie_film = (CopieFilm(f));
	assert (copie_film.second > 0);
	
	f -> UscitaFilm();
}

void Distributore::RitornaFilm(Film* f)
{
	assert (TrovaFilm(f) != -1);
	pair <unsigned,unsigned> copie_film = (CopieFilm(f));
	assert (copie_film.second < copie_film.first);
	
	f -> RitornaFilm();
}

ostream& operator<<(ostream& os, const Film& f)
{
	os << "Il film " << f.titolo << " del regista " << f.regista << endl;
	
	if (f.remake)
		os << " e' un remake del film " << f.originale -> Titolo() << " del regista " << f.originale -> Regista() << ".\n" << endl;
	else
		os << " e' un film originale.\n" << endl;
	
	os << "Di questo film ci sono " << f.catalogo.first << " copie, di cui " << f.catalogo.second << " attualmente presenti.\n\n" << endl;
	
	return os;
}

ostream& operator<<(ostream& os, const Distributore& d)
{
	os << "In questo distributore sono presenti i seguenti film: \n\n" << endl;
	
 	for (unsigned i = 0; i < d.films.size(); i++)
		os << *(d.films[i]);
	
	return os;
}
codice:
#include "distributore.h"

int main()
{
	Distributore d1("Chivideo");
	
	Film f1("Alice in wonderland","R. Polanski",1997), f2("F Punto","F. Miccoli",2002), f3("La donna dei vampiri","M. Rossi",2006),
			 f4("Chatroulette","G. Yespica",2008) , f5("Il frate","G. Abacuz",2003), f6("Gigi la trottola","G. Gialli",1999),
			f7("30 Giorni","L. Verdi",2001);
	
	f7.FissaOriginale(&f1);
	f3.FissaOriginale(&f2);
	
	d1.InserisciFilm(&f1, 20);
	d1.InserisciFilm(&f2, 30);
	d1.InserisciFilm(&f3, 15);
 	d1.InserisciFilm(&f4, 25); 
	d1.InserisciFilm(&f5, 8);
	d1.InserisciFilm(&f6, 10);
	d1.InserisciFilm(&f7, 14);
	
	cout << d1;
		
	return 0;
}
Ho compilato i programmi usando Cygwin e inizia stampando correttamente i primi 3 film inseriti ed al quarto film dopo aver stampato il titolo ed il regista mi dà l'errore:

Segmentation fault (core dumped)

Da quello che ho capito girando nel forum dovrebbe essere un problema di indirizzamento, ma la mia scarsa esperienza non mi permette di identificare il problema e tantomeno di risolverlo.

Ogni aiuto sarà ben apprezzato!!!

Grazie in anticipo.