[vtkusers] Help with crashes in VTK
Jonathan Morra
jonmorra at gmail.com
Thu Sep 8 23:03:58 EDT 2011
So I've spent a bunch of time and removed all the references to
vtkSmartPointer. I'm still getting a lot of crashes. Here is an example of
a crash that I just got without any use of vtkSmartPointers
My code
vtkPolyData* vtkPipelines::getOrganMesh(vtkImageData * const binaryImage) {
vtkPolyData *returnedData = NULL;
vtkMarchingCubes *marching = vtkMarchingCubes::New();
marching->SetInput(binaryImage);
marching->ComputeGradientsOff();
marching->ComputeNormalsOff();
marching->ComputeScalarsOff();
marching->SetValue(0, 0.5);
if (marching->GetOutput()->GetNumberOfPoints() > 0) {
// The decimation makes the render time much faster
vtkDecimatePro* decimate = vtkDecimatePro::New();
decimate->SetInputConnection(marching->GetOutputPort());
decimate->SetTargetReduction(0.6);
decimate->Update();
returnedData = vtkPolyData::New();
returnedData->DeepCopy(decimate->GetOutput());
decimate->Delete();
}
else {
marching->Update();
returnedData = vtkPolyData::New();
returnedData->DeepCopy(marching->GetOutput());
}
marching->Delete(); // Last line of my code before crash occurs
return returnedData;
}
Stack Trace
4a8bdc42()
vtkCommon.dll!vtkGarbageCollectorImpl::CollectComponent(vtkGarbageCollectorImpl::ComponentType
* c=0x073d0c18) Line 702 + 0x2b bytes C++
vtkCommon.dll!vtkGarbageCollectorImpl::CollectInternal(vtkObjectBase *
root=0x07ac2dc8) Line 476 C++
vtkCommon.dll!vtkGarbageCollector::Collect(vtkObjectBase *
root=0x07ac2dc8) Line 907 C++
vtkCommon.dll!vtkObjectBase::UnRegisterInternal(vtkObjectBase *
__formal=0x00000000, int check=1) Line 287 + 0x6 bytes C++
vtkCommon.dll!vtkObject::UnRegisterInternal(vtkObjectBase * o=0x00000000,
int check=1) Line 885 + 0x11 bytes C++
vtkFiltering.dll!vtkAlgorithm::UnRegister(vtkObjectBase * o=0x00000000)
Line 918 C++
vtkCommon.dll!vtkObjectBase::Delete() Line 128 C++
> MVSOrganizerQt.exe!vtkPipelines::getOrganMesh(vtkImageData * const
binaryImage=0x118a7190) Line 507 + 0x9 bytes C++
MVSOrganizerQt.exe!CreateOrganMeshThread::doOrganCreation() Line 30 + 0x6
bytes C++
I'm getting very discouraged trying to fix all of these crashes. Can anyone
suggest some reason for this?
If it matters, this is being called from a thread (although other crashes do
not occur in threads)
On Wed, Sep 7, 2011 at 4:40 PM, Xiaofeng Z <xf10036 at hotmail.com> wrote:
> vtk doesn't use thread to do garbage collection. You have too thread
> running vtk code and your crashes are most likely related to a race
> condition.
>
>
>
> ------------------------------
> Date: Wed, 7 Sep 2011 14:14:48 -0700
>
> Subject: Re: [vtkusers] Help with crashes in VTK
> From: jonmorra at gmail.com
> To: xf10036 at hotmail.com; david.gobbi at gmail.com
> CC: vtkusers at vtk.org
>
> So I was playing around with removing vtkSmartPointers passed by reference
> to see if that fixed my issue.
> 1. Would passing a vtkSmartPointer by const reference be an issue?
> 2. I got the following crash outlined below. It does not reference any
> code I wrote at all. Also in my debugger it says that there are 2 vtk
> garbage collection threads running. My understanding of smart pointers is
> that a garbage collector is unnecessary because if the reference count = 0
> then the object is removed. Also, what could cause this crash?
>
> Thread 1 stack trace
> cccccccc()
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x0687f280) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x179ff5f4) Line 522 + 0x8 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f82880, void * ptr=0x04047640) Line 639 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f82880, void * ptr=0x04047640, const char * __formal=0x6490d51c)
> Line 602 C++
> vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x179ffd90, vtkObjectBase * obj=0x03f82880, void * ptr=0x04047640,
> const char * desc=0x6490d51c) Line 1069 C++
> vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
> * collector=0x179ffd90, vtkInformation * & ptr=, const char *
> desc=0x6490d51c) Line 201 + 0x18 bytes C++
> vtkFiltering.dll!vtkDataObject::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90) Line 1022 C++
> vtkFiltering.dll!vtkPointSet::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90) Line 351 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x0687f168) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x179ff718) Line 522 + 0x8 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x04047618, void * ptr=0x06bf9270) Line 639 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x04047618, void * ptr=0x06bf9270, const char * __formal=0x6490cc14)
> Line 602 C++
> vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x179ffd90, vtkObjectBase * obj=0x04047618, void * ptr=0x06bf9270,
> const char * desc=0x6490cc14) Line 1069 C++
> vtkCommon.dll!vtkGarbageCollectorReport<vtkObjectBase>(vtkGarbageCollector
> * collector=0x179ffd90, vtkObjectBase * & ptr=, const char *
> desc=0x6490cc14) Line 201 + 0x17 bytes C++
> vtkCommon.dll!vtkInformation::ReportAsObjectBase(vtkInformationKey *
> key=0x03ef5f78, vtkGarbageCollector * collector=0x179ffd90) Line 826 + 0x16
> bytes C++
> vtkCommon.dll!vtkInformationKey::ReportAsObjectBase(vtkInformation *
> info=0x03f86bd8, vtkGarbageCollector * collector=0x179ffd90) Line 136 C++
> vtkCommon.dll!vtkInformation::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90) Line 812 + 0xc bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x0687f248) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x179ff864) Line 522 + 0x8 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f86bd8, void * ptr=0x03f84698) Line 639 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f86bd8, void * ptr=0x03f84698, const char * __formal=0x6571055c)
> Line 602 C++
> vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x179ffd90, vtkObjectBase * obj=0x03f86bd8, void * ptr=0x03f84698,
> const char * desc=0x6571055c) Line 1069 C++
> vtkCommon.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
> * collector=0x179ffd90, vtkInformation * & ptr=, const char *
> desc=0x6571055c) Line 201 + 0x17 bytes C++
> vtkCommon.dll!vtkInformationVector::ReportReferences(vtkGarbageCollector
> * collector=0x179ffd90) Line 227 + 0x28 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06983e58) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x179ff980) Line 522 + 0x8 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f85968, void * ptr=0x03c6bb08) Line 639 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f85968, void * ptr=0x03c6bb08, const char * __formal=0x64910f5c)
> Line 602 C++
> vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x179ffd90, vtkObjectBase * obj=0x03f85968, void * ptr=0x03c6bb08,
> const char * desc=0x64910f5c) Line 1069 C++
> vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformationVector>(vtkGarbageCollector
> * collector=0x179ffd90, vtkInformationVector * & ptr=, const char *
> desc=0x64910f5c) Line 201 + 0x18 bytes C++
> vtkFiltering.dll!vtkExecutive::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90) Line 306 + 0xf bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06983c60) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x179ffa9c) Line 522 + 0x8 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03c6bae0, void * ptr=0x03fd5f44) Line 639 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03c6bae0, void * ptr=0x03fd5f44, const char * __formal=0x64910cac)
> Line 602 C++
> vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x179ffd90, vtkObjectBase * obj=0x03c6bae0, void * ptr=0x03fd5f44,
> const char * desc=0x64910cac) Line 1069 C++
> vtkCommon.dll!vtkGarbageCollectorReport<vtkObjectBase>(vtkGarbageCollector
> * collector=0x179ffd90, vtkObjectBase * & ptr=, const char *
> desc=0x64910cac) Line 201 + 0x17 bytes C++
> vtkCommon.dll!vtkSmartPointerBase::Report(vtkGarbageCollector *
> collector=0x179ffd90, const char * desc=0x64910cac) Line 96 + 0x10 bytes
> C++
> vtkFiltering.dll!vtkInformationExecutivePortKey::Report(vtkInformation *
> info=0x03f84158, vtkGarbageCollector * collector=0x179ffd90) Line 157 +
> 0x17 bytes C++
> vtkCommon.dll!vtkInformation::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90) Line 812 + 0xc bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06983d08) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x179ffbe0) Line 522 + 0x8 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f84158, void * ptr=0x04047464) Line 639 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f84158, void * ptr=0x04047464, const char * __formal=0x6490d504)
> Line 602 C++
> vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x179ffd90, vtkObjectBase * obj=0x03f84158, void * ptr=0x04047464,
> const char * desc=0x6490d504) Line 1069 C++
> vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
> * collector=0x179ffd90, vtkInformation * & ptr=, const char *
> desc=0x6490d504) Line 201 + 0x18 bytes C++
> vtkFiltering.dll!vtkDataObject::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90) Line 1022 + 0xf bytes C++
> vtkFiltering.dll!vtkPointSet::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90) Line 351 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06983b48) Line 552 C++
> > vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x02fe0000) Line 522 + 0x8 bytes C++
> kernel32.dll!762214dd()
> [Frames below may be incorrect and/or missing, no symbols loaded for
> kernel32.dll]
> msvcr90.dll!73193c3a()
> msvcr90.dll!731534c7()
> kernel32.dll!7622339a()
> ntdll.dll!76f69ed2()
> ntdll.dll!76f69ea5()
>
> Thread 2 stack trace
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06718db8) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x17aff5f4) Line 522 + 0x8 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f82880, void * ptr=0x04047640) Line 639 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f82880, void * ptr=0x04047640, const char * __formal=0x6490d51c)
> Line 602 C++
> vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x17affd90, vtkObjectBase * obj=0x03f82880, void * ptr=0x04047640,
> const char * desc=0x6490d51c) Line 1069 C++
> vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
> * collector=0x17affd90, vtkInformation * & ptr=, const char *
> desc=0x6490d51c) Line 201 + 0x18 bytes C++
> vtkFiltering.dll!vtkDataObject::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90) Line 1022 C++
> vtkFiltering.dll!vtkPointSet::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90) Line 351 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06679c80) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x17aff718) Line 522 + 0x8 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x04047618, void * ptr=0x06bf9270) Line 639 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x04047618, void * ptr=0x06bf9270, const char * __formal=0x6490cc14)
> Line 602 C++
> vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x17affd90, vtkObjectBase * obj=0x04047618, void * ptr=0x06bf9270,
> const char * desc=0x6490cc14) Line 1069 C++
> vtkCommon.dll!vtkGarbageCollectorReport<vtkObjectBase>(vtkGarbageCollector
> * collector=0x17affd90, vtkObjectBase * & ptr=, const char *
> desc=0x6490cc14) Line 201 + 0x17 bytes C++
> vtkCommon.dll!vtkInformation::ReportAsObjectBase(vtkInformationKey *
> key=0x03ef5f78, vtkGarbageCollector * collector=0x17affd90) Line 826 + 0x16
> bytes C++
> vtkCommon.dll!vtkInformationKey::ReportAsObjectBase(vtkInformation *
> info=0x03f86bd8, vtkGarbageCollector * collector=0x17affd90) Line 136 C++
> vtkCommon.dll!vtkInformation::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90) Line 812 + 0xc bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06679c10) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x17aff864) Line 522 + 0x8 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f86bd8, void * ptr=0x03f84698) Line 639 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f86bd8, void * ptr=0x03f84698, const char * __formal=0x6571055c)
> Line 602 C++
> vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x17affd90, vtkObjectBase * obj=0x03f86bd8, void * ptr=0x03f84698,
> const char * desc=0x6571055c) Line 1069 C++
> vtkCommon.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
> * collector=0x17affd90, vtkInformation * & ptr=, const char *
> desc=0x6571055c) Line 201 + 0x17 bytes C++
> vtkCommon.dll!vtkInformationVector::ReportReferences(vtkGarbageCollector
> * collector=0x17affd90) Line 227 + 0x28 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06717548) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x17aff980) Line 522 + 0x8 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f85968, void * ptr=0x03c6bb08) Line 639 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f85968, void * ptr=0x03c6bb08, const char * __formal=0x64910f5c)
> Line 602 C++
> vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x17affd90, vtkObjectBase * obj=0x03f85968, void * ptr=0x03c6bb08,
> const char * desc=0x64910f5c) Line 1069 C++
> vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformationVector>(vtkGarbageCollector
> * collector=0x17affd90, vtkInformationVector * & ptr=, const char *
> desc=0x64910f5c) Line 201 + 0x18 bytes C++
> vtkFiltering.dll!vtkExecutive::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90) Line 306 + 0xf bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x067174d8) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x17affa9c) Line 522 + 0x8 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03c6bae0, void * ptr=0x03fd6624) Line 639 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03c6bae0, void * ptr=0x03fd6624, const char * __formal=0x64910cac)
> Line 602 C++
> vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x17affd90, vtkObjectBase * obj=0x03c6bae0, void * ptr=0x03fd6624,
> const char * desc=0x64910cac) Line 1069 C++
> vtkCommon.dll!vtkGarbageCollectorReport<vtkObjectBase>(vtkGarbageCollector
> * collector=0x17affd90, vtkObjectBase * & ptr=, const char *
> desc=0x64910cac) Line 201 + 0x17 bytes C++
> vtkCommon.dll!vtkSmartPointerBase::Report(vtkGarbageCollector *
> collector=0x17affd90, const char * desc=0x64910cac) Line 96 + 0x10 bytes
> C++
> vtkFiltering.dll!vtkInformationExecutivePortKey::Report(vtkInformation *
> info=0x03f84b30, vtkGarbageCollector * collector=0x17affd90) Line 157 +
> 0x17 bytes C++
> vtkCommon.dll!vtkInformation::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90) Line 812 + 0xc bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x067173f8) Line 552 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x17affbe0) Line 522 + 0x8 bytes C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f84b30, void * ptr=0x04046ce4) Line 639 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f84b30, void * ptr=0x04046ce4, const char * __formal=0x6490d504)
> Line 602 C++
> vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x17affd90, vtkObjectBase * obj=0x03f84b30, void * ptr=0x04046ce4,
> const char * desc=0x6490d504) Line 1069 C++
> vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
> * collector=0x17affd90, vtkInformation * & ptr=, const char *
> desc=0x6490d504) Line 201 + 0x18 bytes C++
> vtkFiltering.dll!vtkDataObject::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90) Line 1022 + 0xf bytes C++
> vtkFiltering.dll!vtkPointSet::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90) Line 351 C++
> vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x067175f0) Line 552 C++
> > vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x00000000) Line 522 + 0x8 bytes C++
> QtGui4.dll!009284f2()
> kernel32.dll!762214dd()
> msvcr90.dll!73193c3a()
> msvcr90.dll!731534c7()
> kernel32.dll!7622339a()
> ntdll.dll!76f69ed2()
> ntdll.dll!76f69ea5()
>
>
> On Wed, Sep 7, 2011 at 9:45 AM, Xiaofeng Z <xf10036 at hotmail.com> wrote:
>
> >I've been using vtkImageData::New(), followed by
> vtkImageData->DeepCopy(filter->GetOutput()). I've been doing this cause I
> notice that once I delete the filter the output no longer exists.
>
> Don't deep copy the image, instead do:
>
> vtkImageData* filterOutput = filter->GetOutput();
> filterOutput->Register(0); // increment the ref count
>
> to keep the output in the memory.
>
> Just make sure you pair off every New() or Register() with a Delete().
>
> BTW, I'm not for or against the use of smart pointer for any fundamental
> reason. If one knows very well how a smart pointer class works, using
> the smart pointer to left the burden of tracking memory allocation can be
> very helpful. When I do decided to use smart pointer, I use it exclusively,
> much like in Java where every variable is a managed smart pointer. Mixing
> the usage of smart pointers and naked pointers is where trouble comes in.
>
> HTH
>
> On Tue, Sep 6, 2011 at 11:55 AM, David Gobbi <david.gobbi at gmail.com>wrote:
>
> On Tue, Sep 6, 2011 at 12:34 PM, Jonathan Morra <jonmorra at gmail.com>wrote:
>
> This could make sense, I'm going to try and change all my method signatures
> to pass around const references to vtkSmartPointers where appropriate. Do
> you know what happens to the reference count upon returning a
> vtkSmartPointer?
>
>
>
> In VTK, smart pointers should only be used to store references, not to pass
> them. VTK methods should take regular pointers as arguments.
>
> The general rules are:
>
> 1) Refcounts are not automatically incremented when objects are returned,
> i.e. when an object is returned to you, then you are just "borrowing" it.
> If you need to own it for a while, then store it in a smart pointer.
>
> 2) Refcounts are not automatically incremented when objects are passed to a
> method. If a method needs to own the object for a while, it should store it
> in a smart pointer. All methods in the VTK libraries that need to own the
> objects that are passed to them will increment the refcount of those
> objects, either by storing it in a smart pointer or by calling Register() on
> it.
>
> There are a few very rare exceptions to rule #1, such as the NewInstance()
> method.
>
> - David
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20110908/aa2fa704/attachment.htm>
More information about the vtkusers
mailing list