Mi sapete dire perchè questo programma a volte va in segmentation fault (errore #11) ?? Ho sbagliato qualcosa coi puntatori?? Grazie.

codice:
/*
ID: gygabyt1
LANG: C++
TASK: gift1
*/
//---------------------------------------------------------------------------

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//---------------------------------------------------------------------------

typedef struct Persona
{
	string Name;
	int Soldi;
	int Inizio;
	string *Dest;
	int NDest;
} Persona;

//---------------------------------------------------------------------------

	Persona *Persone;


int getPersonaIndex(string name)
{
	int i=0;
	while(Persone[i++].Name!=name);
	return i-1;
}
Persona getPersonaStr(string name)
{
	return Persone[getPersonaIndex(name)];
}


//---------------------------------------------------------------------------

void Mostra(int i)
{
    cout << Persone[i].Name << "\t" << Persone[i].Inizio << "\t" << Persone[i].Soldi << endl;
}

int main()
{
	ifstream in("gift1.in");
	ofstream out("gift1.out");

	int NP; in >> NP;
	Persone = new Persona[NP];
	for (int i=0; i<NP; i++)
		in >> Persone[i].Name;

	while (!in.eof())
	{
		string Donatore; in >> Donatore;
		Persona Temp = getPersonaStr(Donatore);
		in >> Temp.Soldi >> Temp.NDest; Temp.Inizio = Temp.Soldi;
		Temp.Dest = new string[Temp.NDest];
		for (int i=0; i<Temp.NDest; i++)
			in >> Temp.Dest[i];
		Persone[getPersonaIndex(Donatore)] = Temp;
	}

	for (int i=0; i<NP; i++)
	{
		for (int j=0; j<Persone[i].NDest; j++)
		{
			Persone[getPersonaIndex(Persone[i].Dest[j])].Soldi+=Persone[i].Inizio/Persone[i].NDest;
			Persone[i].Soldi -= Persone[i].Inizio/Persone[i].NDest;
		}
		
		//Mostra(i);
	}

	for (int i=0; i<NP; i++)
	{
		out << Persone[i].Name << " " << Persone[i].Soldi-Persone[i].Inizio << endl;
	}

	return 0;
}
//------------
Grazie