<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Feb 5, 2014 at 8:02 PM, David Liu <span dir="ltr"><<a href="mailto:daveliu@mit.edu" target="_blank">daveliu@mit.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Hi, this is a question mainly to clear up my understanding of what the Vec object is. Consider the following C++ code:<div><br></div><div>//=========================</div><div><br></div><div><div>
#include <petsc.h></div><div><br></div><div><br></div><div>class thing{</div><div><br></div><div><span style="white-space:pre-wrap">        </span>public:</div><div><span style="white-space:pre-wrap">  </span>Vec x;</div>
<div><span style="white-space:pre-wrap">  </span>thing(){};</div><div><span style="white-space:pre-wrap">       </span>thing(int N){ </div><div><span style="white-space:pre-wrap">           </span>PetscPrintf(PETSC_COMM_WORLD, "x before create = %i\n", x);</div>

<div><span style="white-space:pre-wrap">          </span>VecCreateSeq(PETSC_COMM_SELF, N, &x);</div><div><span style="white-space:pre-wrap">                </span>PetscPrintf(PETSC_COMM_WORLD, "x after create = %i\n", x);</div>
<div><span style="white-space:pre-wrap">  </span>}</div><div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap"> </span>~thing(){</div><div><span style="white-space:pre-wrap">                </span>PetscPrintf(PETSC_COMM_WORLD, "x before destroy = %i\n", x);<span style="white-space:pre-wrap">  </span></div>

<div><span style="white-space:pre-wrap">          </span>VecDestroy(&x);</div><div><span style="white-space:pre-wrap">              </span>PetscPrintf(PETSC_COMM_WORLD, "x after destroy = %i\n", x);<span style="white-space:pre-wrap">                   </span></div>

<div><span style="white-space:pre-wrap">  </span>}</div><div><span style="white-space:pre-wrap">        </span></div><div>};</div><div><br></div><div><br></div><div>int main(int argc, char** argv){</div><div><br></div><div>
<span style="white-space:pre-wrap">     </span>PetscInitialize(&argc, &argv, PETSC_NULL, PETSC_NULL);</div><div><br></div><div><span style="white-space:pre-wrap">  </span>thing t;</div><div><span style="white-space:pre-wrap"> </span>PetscPrintf(PETSC_COMM_WORLD, "x before everything = %i\n", t.x);</div>

<div><span style="white-space:pre-wrap">  </span>t = thing(2);</div><div><span style="white-space:pre-wrap">    </span>PetscPrintf(PETSC_COMM_WORLD, "x after everything = %i\n", t.x);</div><div><span style="white-space:pre-wrap">       </span></div>

<div><span style="white-space:pre-wrap">  </span>PetscFinalize();</div><div>}</div></div><div><br></div><div>//=========================<br></div><div><br></div><div>The output, when run sequentially, is</div><div><br>
</div><div><div>x before everything = 0</div><div>x before create = 0</div><div>x after create = -326926224</div><div>x before destroy = -326926224</div><div>x after destroy = 0</div><div>x after everything = -326926224</div>

</div><div><br></div><div>(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. </div><div>

<br></div><div>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? </div>

</div>
</blockquote></div><br>This has nothing to do with Vec, it is about C++ copy semantics. This is why I would</div><div class="gmail_extra">never tell someone to use C++.</div><div class="gmail_extra"><br></div><div class="gmail_extra">
   Matt<br clear="all"><div><br></div>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener
</div></div>