Copy construction of VariableSizeCommunicator leads to runtime errors.

VariableSizeCommunicator does not have copy constructors (or assignment operator) implemented. The default generated constructor copies the MPI_Comm communication_ member without using MPI_Comm_dup. Thus, when the copy constructed object and its source both have a communication_ member pointing to the same data, which is double freed (by MPI_Comm_free) when the objects get destructed. This could be fixed by writing a suitable copy constructor.

I only had a quick glance, but it seems that BufferedCommunicator uses neither MPI_Comm_dup nor MPI_Comm_free and thus does not assume any responsibility for its data. Maybe this would be a viable approach, too.