[petsc-users] question about the PETSc Vec object and C++ destructors

David Liu daveliu at mit.edu
Wed Feb 5 20:02:40 CST 2014

Hi, this is a question mainly to clear up my understanding of what the Vec
object is. Consider the following C++ code:


#include <petsc.h>

class thing{

Vec x;
thing(int N){
PetscPrintf(PETSC_COMM_WORLD, "x before create = %i\n", x);
VecCreateSeq(PETSC_COMM_SELF, N, &x);
PetscPrintf(PETSC_COMM_WORLD, "x after create = %i\n", x);
PetscPrintf(PETSC_COMM_WORLD, "x before destroy = %i\n", x);
PetscPrintf(PETSC_COMM_WORLD, "x after destroy = %i\n", x);

int main(int argc, char** argv){

PetscInitialize(&argc, &argv, PETSC_NULL, PETSC_NULL);

thing t;
PetscPrintf(PETSC_COMM_WORLD, "x before everything = %i\n", t.x);
t = thing(2);
PetscPrintf(PETSC_COMM_WORLD, "x after everything = %i\n", t.x);


The output, when run sequentially, is

x before everything = 0
x before create = 0
x after create = -326926224
x before destroy = -326926224
x after destroy = 0
x after everything = -326926224

(among some unimportant error messages). If I try to VecGetSize(t.x, &N),
immediately after the line "t = thing(2)", I get an error indicating that
t.x has been destroyed.

This behavior, as well as the printed output, suggests that the destructor
being called during the line "t = thing(2)" is destroying the Vec just
created by "thing(2)". Shouldn't it be destroying the Vec declared by the
very first "thing t", and hence throwing an error saying that you can't
destroy a v that has not been created?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20140205/fb551aff/attachment.html>

More information about the petsc-users mailing list