Explore what will happen when we use delete on vtkSmartPointer<vtkActor> object.

    vtkSmartPointer<vtkActor> leftActor =
            vtkSmartPointer<vtkActor>::New();
    leftActor->SetMapper( mapper );
//...
    void *ptr = leftActor.Get();
    leftActor->GetProperty()->SetColor( 1, 0, 0 );
    rightActor->GetProperty()->SetColor( 0, 1, 0 );
    leftActor->Delete();
    cout << "leftActor: " << (void *)leftActor.Get() << endl;
    cout << "leftActor reference count: " << leftActor->GetReferenceCount() << endl;
    if( ptr && leftActor->GetReferenceCount() > 0 )
    {
        leftRenderer->AddActor( leftActor );
    }
    if( rightActor )
    {
        rightRenderer->AddActor( rightActor );
    }

output:

leftActor: 0x7ff976417b00
leftActor reference count: -1073741824
17:07:04: The program has unexpectedly finished.
17:07:04: The process was ended forcefully.

The delete function free allocated memory but the internal pointer is not null. vtkSmartPointer try to handle memory that has bee freed. So it crashed once we try to close the program.

Remove vtkSmartPointer In the code snippet:

    vtkActor *leftActor = vtkActor::New();
    //...
    leftActor->GetProperty()->SetColor( 1, 0, 0 );
    rightActor->GetProperty()->SetColor( 0, 1, 0 );
    while( leftActor->GetReferenceCount() > 0 )
    {
        leftActor->Delete();
    }
    leftActor = nullptr;
    cout << "leftActor: " << (void *)leftActor << endl;
    if( nullptr != leftActor && leftActor->GetReferenceCount() > 0 )
    {
        cout << "leftActor reference count: " << leftActor->GetReferenceCount() << endl;
        leftRenderer->AddActor( leftActor );
    }

output:

leftActor: 0x0
Categories: VTK

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments

Content Summary
: Input your strings, the tool can get a brief summary of the content for you.

X
0
Would love your thoughts, please comment.x
()
x