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

neil liu liufield at gmail.com
Wed Jun 21 15:58:14 CDT 2023


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
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20230621/af19e4c7/attachment.html>


More information about the petsc-users mailing list