[petsc-users] Inquiry about the c++ destructor and PetscFinalize.

Jacob Faibussowitsch jacob.fai at gmail.com
Wed Jun 21 16:12:33 CDT 2023


> 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 <liufield at 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 <liufield at gmail.com> wrote:
> Thanks a lot, Constantine. It works pretty well.
> 
> 
> 
> On Fri, Jun 16, 2023 at 6:52 PM Constantine Khrulev <ckhroulev at 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
> 



More information about the petsc-users mailing list