[Qgis-developer] Memory Error

Martin Dobias wonder.sk at gmail.com
Thu Jan 8 07:48:38 EST 2009


On Thu, Jan 8, 2009 at 1:22 PM, Carson Farmer <carson.farmer at gmail.com> wrote:
> Hi list,
>
> Does anyone have any idea why the following python error might pop up:
>
> An error has occured while executing Python code:
>
> Traceback (most recent call last):
>   File
> "/home/_user_name_/.qgis/python/plugins/fTools/tools/doGeoprocessing.py",
> line 58, in outFile
>     ( self.shapefileName, self.encoding ) =
> ftools_utils.saveDialog( self )
>   File
> "/home/_user_name_/.qgis/python/plugins/fTools/tools/ftools_utils.py", line
> 292, in saveDialog
>     shapefileName = unicode(fileDialog.selectedFiles().first())
> MemoryError
>
> The associated code is essentially as follows:
>
> fileDialog = QgsEncodingFileDialog()
>
> fileDialog.setDefaultSuffix(QString("shp"))
>
> fileDialog.setFileMode(QFileDialog.AnyFile)
>
> fileDialog.setAcceptMode(QFileDialog.AcceptSave)
>
> fileDialog.exec_()
>
> shapefileName = unicode(fileDialog.selectedFiles().first())
>
> I can't actually seem to get this behaviour myself, but many others do.
>
> Any thoughts?

Hi Carson,

I suspect there is something wrong with handling of the returned
string list. first() method returns only a reference so imagine this
scenario:
1. a new temporary list is created as a result of calling
fileDialog.selectedFiles()
2. first() is called which returns reference to first item in the temporary list
3. now the list is not needed anymore, so it gets deleted (!), the
reference is left broken
4. conversion of broken reference raises MemoryError

That's what I think. This also explains why it works sometimes and
sometimes not. A similar problem is this (ticket #777):
feat = QgsFeature ( .... )
geom = feat.geometry()
del feat

This time feature is deleted but geom contains invalid pointer. I've
been adviced to use virtual destructor on QgsFeature that would notify
geometry object that the pointer is invalid, however I had no success.

I would recommend you to ask also on PyQt/PyKDE mailing list to be
sure. And how to work this around? Just store the reference to string
list while it's needed:
files = fileDialog.selectedFiles()
shapefileName = unicode(files.first())

Regards
Martin


More information about the Qgis-developer mailing list