Dear Petsc developers,

I am trying to use Petsc with C++. And came across one issue.
Class DMManage has been defined, one default constructor and destructor has
been defined there.
The code has a runtime error, "double free or corruption". Finally I found
that, this is due to PetscFinalize. If I called explicitly the destructor
before this PetscFinalze, the error will disappear.

Does that mean  PetscFinalize do some work to destroy DM?

Thanks,

#include <petscdmplex.h>
#include <petscdmadaptor.h>
#include <petscds.h>
#include <petscviewerhdf5.h>

class DMManage{
  PetscSF distributionSF;
public:
  DM dm;
  DMManage();
  ~DMManage();
};

DMManage::DMManage(){
  const char filename[] = "ParallelWaveguide.msh";
  DM dmDist;
  PetscViewer viewer;
  PetscViewerCreate(PETSC_COMM_WORLD, &viewer);
  PetscViewerSetType(viewer, PETSCVIEWERASCII);
  PetscViewerFileSetMode(viewer, FILE_MODE_READ);
  PetscViewerFileSetName(viewer, filename);
  DMPlexCreateGmsh(PETSC_COMM_WORLD, viewer, PETSC_TRUE, &dm);
  PetscViewerDestroy(&viewer);
  PetscInt overlap = 0;
  DMPlexDistribute(dm, overlap, &distributionSF, &dmDist);
  std::cout<<&dm<<std::endl;
  if (dmDist) {
    DMDestroy(&dm);
    dm = dmDist;
  }
  DMDestroy(&dmDist);
}

DMManage::~DMManage(){
  DMDestroy(&dm);
}

int main(int argc, char** argv) {
  PetscFunctionBeginUser;
  PetscCall(PetscInitialize(&argc, &argv, NULL, help));

  DMManage objDMManage;

  PetscFinalize();
  return 0;
}

Reply via email to