<div dir="ltr"><div dir="ltr"><div>Hi Frank,</div><div><br></div><div>The scope is essentially the enclosing "{ }", but you are missing a bit of</div><div>information about how VTK objects are reference counted.</div><div><br></div><div>When you create a VTK object with vtkSmartPointer<...>::New(), the</div><div>object is created with a reference count of 1, and the New() returns a</div><div>smart pointer.  When that smart pointer goes out of scope, the reference</div><div>count of the object is decremented.  It's important to note that the</div><div>reference count is stored in the object, not in the smart pointer!</div><div><br></div><div>So if the reference count of an object is greater than 1, then the object</div><div>will not be deleted when the smart pointer goes out of scope.  But in</div><div>the case of your reader, its reference count is 1, so it will be deleted.</div><div><br></div><div>The reason its output isn't deleted is because you have done this:</div><div>  changer->SetInputData(reader->GetOutput());</div><div><br></div><div>The 'output' object has its own reference count, which is incremented</div><div>when you call SetInputData( output ).  In other words, after you give</div><div>the reader's output to the changer, the changer holds a reference to it.</div><div><br></div><div>So at the end of the scope of your test() function, the reader will be</div><div>deleted, but its output will not be deleted.</div><div><br></div><div>  David</div><div><br></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Nov 1, 2018 at 6:45 AM Franks <<a href="mailto:masterwangzx@gmail.com">masterwangzx@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi list,<br>
<br>
I have got a problem about the use of vtkSmartPointer. For <br>
vtkSmartPointer<vtkXMLPolyDataReader> Reader =<br>
vtkSmartPointer<vtkXMLPolyDataReader>::New();<br>
vtkPolyData* pd = Reader->GetOutput(); , <br>
/VTK/Tutorials/SmartPointers/ says *when the reader object goes out of<br>
scope, the data is deleted*. I just can not understand What is the meaning<br>
of out of scope. Does it means out of {}? I write some code to confirm it. <br>
<br>
vtkSmartPointer<vtkImageChangeInformation> test() {<br>
    auto reader = vtkSmartPointer<vtkBMPReader>::New();<br>
    reader->SetFileName("../res/lena.bmp");<br>
    reader->Update();<br>
    auto changer = vtkSmartPointer<vtkImageChangeInformation>::New();<br>
    changer->SetInputData(reader->GetOutput());<br>
<br>
    return changer;<br>
}<br>
<br>
TEST_F(VTKTest,Execute){<br>
    auto changer = test();<br>
    auto imgActor = vtkSmartPointer<vtkImageActor>::New();<br>
    imgActor->GetMapper()->SetInputConnection(changer->GetOutputPort());<br>
<br>
    auto renderer = vtkSmartPointer<vtkRenderer>::New();<br>
    renderer->AddActor(imgActor);<br>
    renderer->SetBackground(1.0, 1.0, 1.0);<br>
<br>
    auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();<br>
    renderWindow->AddRenderer(renderer);<br>
    renderWindow->Render();<br>
<br>
    auto renderWindowInteractor =<br>
vtkSmartPointer<vtkRenderWindowInteractor>::New();<br>
    auto style = vtkSmartPointer<vtkInteractorStyleImage>::New();<br>
<br>
    renderWindowInteractor->SetInteractorStyle(style);<br>
    renderWindowInteractor->SetRenderWindow(renderWindow);<br>
    renderWindowInteractor->Initialize();<br>
<br>
    renderWindowInteractor->Start();<br>
}<br>
<br>
>From the above code, I think the object reader will delete when the function<br>
test() return. When the object reader deleted, the reader's output data<br>
delete and no data streams to object changer and the following object. But<br>
my thought was wrong, the program run well. I do not konw where am I wrong.<br>
<br>
I look forward to hearing from you.<br>
        Best regards,<br>
        Frank<br>
</blockquote></div></div></div>