Here is my class constructor :

template <typename ImageT>
SpatialModelKernel<ImageT>::SpatialModelKernel(
    detection::Footprint::Ptr const &fpPtr,
    MaskedImagePtr const &miToConvolvePtr,
    MaskedImagePtr const &miToNotConvolvePtr,
    boost::shared_ptr<PsfMatchingFunctor<ImageT> > const &kFunctor,
    policy::Policy const &policy,
    bool build
    ) :
    diffim::SpatialModelBase<ImageT>(),
    _fpPtr(fpPtr),
    _miToConvolvePtr(miToConvolvePtr),
    _miToNotConvolvePtr(miToNotConvolvePtr),
    _kFunctor(kFunctor),
    _policy(policy),
    _kPtr(boost::shared_ptr<math::Kernel>()),
    _kErrPtr(boost::shared_ptr<math::Kernel>()),
    _kSum(0.),
    _bg(0.),
    _bgErr(0.),
    _kStats(boost::shared_ptr<ImageStatistics<image::MaskedImage<ImageT> > >())

Now, from Python if I create an instance of this class like so :

                    model = diffimLib.SpatialModelKernelF(fpPtr,
                                                          afwImage.MaskedImageF(templateMaskedImage, fpBBox),
                                                          afwImage.MaskedImageF(scienceMaskedImage, fpBBox),
                                                          kFunctor,
                                                          policy,
                                                          False)

I lose track of the information in miToConvolvePtr,miToNotConvolvePtr as soon as I exit the constructor. However, if I say

                    i1 = afwImage.MaskedImageF(templateMaskedImage, fpBBox)
                    i2 = afwImage.MaskedImageF(scienceMaskedImage, fpBBox)
                    model = diffimLib.SpatialModelKernelF(fpPtr,
                                                          i1,
                                                          i2,
                                                          kFunctor,
                                                          policy,
                                                          False)

it all works fine and dandy.


Another example. This fails:

for i in range(n):
    for j in range(n):
        subim1 = afwImage.MaskedImageF(mi, bbox)
        subim2 = afwImage.MaskedImageF(mi, bbox)

        model   = ipDiffim.SpatialModelKernelF(fp, subim1, subim2, kFunctor, policy, False)
        modelList.push_back(model)

        print i, j, j + i*n, 'Im0',  type(subim1)
        print i, j, j + i*n, 'Im1a', type(model.getMiToConvolvePtr())
        print i, j, j + i*n, 'Im1b', type(modelList[j + i*n].getMiToConvolvePtr())
    for j in range(n):
        print i, j, j + i*n, 'Im2', type(modelList[j + i*n].getMiToConvolvePtr())
---
0 0 0 Im0 <class 'lsst.afw.image.imageLib.MaskedImageF'>
0 0 0 Im1a <class 'lsst.afw.image.imageLib.MaskedImageF'>
0 0 0 Im1b <class 'lsst.afw.image.imageLib.MaskedImageF'>
0 1 1 Im0 <class 'lsst.afw.image.imageLib.MaskedImageF'>
0 1 1 Im1a <class 'lsst.afw.image.imageLib.MaskedImageF'>
0 1 1 Im1b <class 'lsst.afw.image.imageLib.MaskedImageF'>
Segmentation fault

since subim1 and subim2 go out of scope after the j loop. At least I thought that was why...

I figured that if I defined early in the script

subim1 = afwImage.MaskedImageF()
subim2 = afwImage.MaskedImageF()

this would fix things. However, it still crashes in one window I am testing it in. In another window the exact same script runs. Clearly a memory problem...