[Interest] App crashing because of ImageProvider when exiting

Sérgio Martins sergio.martins at kdab.com
Wed Jul 25 13:20:04 CEST 2018


Hi Nuno,


The docs for QQmlEngine::addImageProvider() say: "The QQmlEngine takes 
ownership of provider".

So QQmlEngine::removeImageProvider() is calling free() on stack 
variable, hence it complains that address wasn't heap allocated.

Create it on the heap as suggested by Jean-Michaël.


Regards,
-- 
Sérgio Martins | sergio.martins at kdab.com | Senior Software Engineer
Klarälvdalens Datakonsult AB, a KDAB Group company
Tel: Sweden (HQ) +46-563-540090, USA +1-866-777-KDAB(5322)
KDAB - The Qt, C++ and OpenGL Experts



On 2018-07-25 11:59, Nuno Santos wrote:
> Jean,
> 
> This is the main context. It will not get out until app.exec() 
> terminates.
> 
> That’s why I’m connecting to aboutToQuit signal in order to remove the
> provider from the Qml engine.
> 
> I had the provider instantiated inside the controller but I was having
> this problem already, therefore my efforts in getting it fixed.
> 
> QQmlApplicationEngine *e;
> 
> int main(int argc, char *argv[])
> {
>     QGuiApplication app(argc, argv);
> 
>     Controller controller;
> 
>     QQmlApplicationEngine engine;
> 
>     e = &engine;
> 
>     engine.rootContext()->setContextProperty("controller", 
> &controller);
>     engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
> 
>     ImageProvider imageProvider;
>     engine.addImageProvider("pictures", &imageProvider);
> 
>     QObject::connect(&app, &QGuiApplication::aboutToQuit, [=]()
>     {
>         e->removeImageProvider("pictures");
>     });
> 
>     return app.exec();
> }
> 
> Any ideas?
> 
> Regards,
> 
> Nuno
> 
>> On 25 Jul 2018, at 11:30, Jean-Michaël Celerier 
>> <jeanmichael.celerier at gmail.com> wrote:
>> 
>> Shouldn't you allocate your ImageProvider on the heap or at least 
>> ensure that it survives during the whole execution ? here it will be 
>> deleted by the end of your function
>> 
>> 
>> 
>> -------
>> Jean-Michaël Celerier
>> http://www.jcelerier.name <http://www.jcelerier.name/>
>> On Wed, Jul 25, 2018 at 11:24 AM, Nuno Santos 
>> <nunosantos at imaginando.pt <mailto:nunosantos at imaginando.pt>> wrote:
>> Hi,
>> 
>> Yesterday I have used for the first time a QQuickImageProvider but I’m 
>> having problems because now the app crashes when I terminate it.
>> 
>> Tried to do the following in order to avoid the crash but it is 
>> crashing anyway:
>> 
>> ImageProvider imageProvider;
>> engine.addImageProvider("pictures", &imageProvider);
>> 
>> QObject::connect(&app, &QGuiApplication::aboutToQuit, [=]()
>> {
>>     e->removeImageProvider("pictures");
>> });
>> 
>> The crash is always something like this:
>> 
>> malloc: *** error for object 0x7ffeef34e900: pointer being freed was 
>> not allocated
>> 
>> Does anyone knows how to fix this?
>> 
>> Thanks!



More information about the Interest mailing list