> If the line "DMDestroy(dmDist)" is commented out, the error will go away
> > if (dmDist) { > > DMDestroy(&dm); > > dm = dmDist; > > } > > DMDestroy(&dmDist); This is because you are double-destroying dmDist here. Note that all petsc objects are pointers, so assignment may not do what you think it does. In this case, DM is a struct *_p_DM. So removing DMDestroy(dmDist) is correct. Best regards, Jacob Faibussowitsch (Jacob Fai - booss - oh - vitch) > On Jun 21, 2023, at 16:58, neil liu <liufi...@gmail.com> wrote: > > It works well for one processor; but when I tried two processors using > mpiexec -n 2 ./ex1, > there is an error shown as belows. If the line "DMDestroy(dmDist)" is > commented out, the error will go away. This is a little confusing for me. > > [1]PETSC ERROR: --------------------- Error Message > -------------------------------------------------------------- > [1]PETSC ERROR: Corrupt argument: https://petsc.org/release/faq/#valgrind > [1]PETSC ERROR: Object already free: Parameter # 1 > [1]PETSC ERROR: See https://petsc.org/release/faq/ for trouble shooting. > [1]PETSC ERROR: Petsc Release Version 3.19.1, Apr 30, 2023 > [1]PETSC ERROR: ./ex1 on a arch-linux-c-debug named kirin.remcominc.com by > xiaodong.liu Wed Jun 21 16:54:46 2023 > [1]PETSC ERROR: Configure options --with-cc=gcc --with-cxx=g++ > --with-fc=gfortran --download-mpich --download-fblaslapack --download-ctetgen > [1]PETSC ERROR: #1 DMDestroy() at > /home/xiaodong.liu/Documents/petsc-3.19.1/src/dm/interface/dm.c:639 > [0]PETSC ERROR: --------------------- Error Message > -------------------------------------------------------------- > [0]PETSC ERROR: Corrupt argument: https://petsc.org/release/faq/#valgrind > [0]PETSC ERROR: Object already free: Parameter # 1 > [0]PETSC ERROR: See https://petsc.org/release/faq/ for trouble shooting. > [0]PETSC ERROR: Petsc Release Version 3.19.1, Apr 30, 2023 > [0]PETSC ERROR: ./ex1 on a arch-linux-c-debug named kirin.remcominc.com by > xiaodong.liu Wed Jun 21 16:54:46 2023 > [0]PETSC ERROR: Configure options --with-cc=gcc --with-cxx=g++ > --with-fc=gfortran --download-mpich --download-fblaslapack --download-ctetgen > [0]PETSC ERROR: #1 DMDestroy() at > /home/xiaodong.liu/Documents/petsc-3.19.1/src/dm/interface/dm.c:639 > > On Tue, Jun 20, 2023 at 12:36 PM neil liu <liufi...@gmail.com> wrote: > Thanks a lot, Constantine. It works pretty well. > > > > On Fri, Jun 16, 2023 at 6:52 PM Constantine Khrulev <ckhrou...@alaska.edu> > wrote: > In your code the destructor of DMManage is called at the end of scope, > i.e. after the PetscFinalize() call. > > You should be able to avoid this error by putting "DMManage objDMManage" > in a code block to limit its scope and ensure that it is destroyed > before PETSc is finalized: > > int main(int argc, char** argv) { > PetscFunctionBeginUser; > PetscCall(PetscInitialize(&argc, &argv, NULL, help)); > > { > DMManage objDMManage; > } // objDMManage is destroyed here > > PetscFinalize(); > return 0; > } > > On 6/16/23 14:13, neil liu wrote: > > 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; > > } > > -- > Constantine >