OK I get it,
I found my mistake: Deleting face is a very very bad thing. Since it makes the cdt invalid and mess up everything.
So What I do:
(1) Instead of delete faces I just mark them to be outside the domain :
fit->set_marked(false);
(2) A border edge has one face is in the domain, another isn't :
for (Cdt::Finite_edges_iterator eit = cdt.finite_edges_begin(); eit != cdt.finite_edges_end(); ++eit)
{
const Cdt::Face_handle& fh = eit->first;
int ctr = 0;
if(fh->is_in_domain())
{
ctr++;
}
if(fh->neighbor(eit->second)->is_in_domain())
{
ctr++;
}
if(ctr == 1)
{
Cdt::Segment s = cd_cdt.segment(eit);
// yeah, I get my border !!
}
}