[vtkusers] Recreating a smart pointer object after deletion
David Gobbi
david.gobbi at gmail.com
Tue Nov 23 12:35:02 EST 2010
On Tue, Nov 23, 2010 at 10:04 AM, David Doria <daviddoria at gmail.com> wrote:
> Once you Delete() a smart pointer, how do you create a new object with
> the same pointer?
>
> Below is a demo. Can someone please confirm or correct the comments?
>
> // Create a smart pointer to a vtkFloatArray object
> vtkSmartPointer<vtkFloatArray> distances =
> vtkSmartPointer<vtkFloatArray>::New();
> std::cout << distances->GetNumberOfComponents() << std::endl;
>
> // Delete the vtkFloatArray object, but the smart pointer still exists
> distances->Delete();
> //std::cout << distances->GetNumberOfComponents() << std::endl; //
> Of course this will crash
>
Yeah, calling Delete() on a smart pointer is not a good thing.
> // This is wrong, because this creates another smart pointer AND another
> object
> distances = vtkSmartPointer<vtkFloatArray>::New();
> std::cout << distances->GetNumberOfComponents() << std::endl; //
> Even though it is wrong, it seems like it should still work, but it
> crashes
>
Like you, my first guess is that it should work. But I suspect that it
breaks because it doesn't do reference count additions/subtractions in the
correct order, what with the creation of a temporary smart pointer followed
by assignment to another smart pointer and deletion of the temporary.
> // This is right because it leaves the smart pointer alone and gives
> it a new vtkFloatArray object
> distances.Take(vtkFloatArray::New());
> std::cout << distances->GetNumberOfComponents() << std::endl; // It
> still crashes (Deleting unknown object: vtkObjectBase)
>
The method you want is TakeReference(). The Take() method is a static
method.
David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20101123/6e840fec/attachment.htm>
More information about the vtkusers
mailing list