Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] violation d'accès mémoire

Sujet résolu
    19 août 2019 à 11:28:14

    bonjour à vous

    j'ai un soucis de  compréhension sur une histoire de pointeur

    voici le code:

    le fichier PRO

    # ----------------------------------------------------
    # This file is generated by the Qt Visual Studio Tools.
    # ------------------------------------------------------
    
    TEMPLATE = app
    TARGET = Example2
    DESTDIR = ./x64/Debug
    QT += core gui widgets webengine webenginewidgets
    CONFIG += debug console
    DEFINES += _UNICODE _ENABLE_EXTENDED_ALIGNED_STORAGE WIN64 QT_DLL QT_WEBENGINE_LIB QT_WEBENGINECORE_LIB QT_WEBENGINEWIDGETS_LIB QT_WIDGETS_LIB
    INCLUDEPATH += . \
        ./GeneratedFiles/$(ConfigurationName)
    DEPENDPATH += .
    MOC_DIR += ./GeneratedFiles/$(ConfigurationName)
    OBJECTS_DIR += debug
    UI_DIR += ./GeneratedFiles
    RCC_DIR += ./GeneratedFiles
    HEADERS += ./my_window.h
    SOURCES += ./main.cpp \
        ./my_window.cpp
    

    le main.cpp

    #include <QApplication>
    #include "my_window.h"
    
    
    int main(int argc, char *argv[])
    {
    	QApplication app(argc, argv);
    	My_Window* fen = new My_Window;
    	fen->show();
    	
    	return app.exec();
    }

    my_window.h

    #pragma once
    
    #include <QtWidgets>
    #include <QtWebEngineWidgets>
    
    class My_Window: public QMainWindow
    {
    	Q_OBJECT
    
    public:
    	My_Window(QWidget *parent = nullptr);
    	~My_Window();
    	QWidget* createView();
    };
    

    my_window.cpp

    #include "my_window.h"
    
    My_Window::My_Window(QWidget *parent)
    	: QMainWindow(parent)
    {
    	setCentralWidget(createView());
    }
    
    My_Window::~My_Window()
    {}
    
    QWidget* My_Window::createView()
    {
    	QWidget* tab = new QWidget;
    	QWebEngineView * vu = new QWebEngineView;
    	QHBoxLayout*layout = new QHBoxLayout;
    	layout->addWidget(vu);
    	tab->setLayout(layout);
    	return tab;
    }
    

    il s'éxécute bien mais lorsque  ferme la fenêtre j'ai ceci




    Mais lorsque pour la fenêtre je n'utilise pas un pointeur op le problème disparaît.

    pourquoi?

    • Partager sur Facebook
    • Partager sur Twitter
      21 août 2019 à 18:35:46

      Bonjour,

      Par défaut, si tu alloues une fenêtre sous forme de pointeur, même quand l'application est quittée, la fenêtre n'est pas détruite proprement et son destructeur n'est pas appelé, et apparemment ça pose problème pour QWebEngine.

      Pour régler ça, tu peux au choix: 

      • ajouter l'attribut Qt::WA_DeleteOnClose à la fenêtre ( fen->setAttribute(Qt::WA_DeleteOnClose); ),
      • l'allouer sans pointeur,
      • connecter le signal "QApplication::lastWindowClosed" au slot "QObject::deleteLater" de la fenêtre pour le fermer.
      • ou gérer la suppression de la fenêtre par un autre moyen.
      Mais généralement, si tu as un new dans le code, et qu'en plus, pour un objet Qt, tu ne définis pas de parent pour cet objet, tu devrais avoir un delete explicite à la fin.
      • Partager sur Facebook
      • Partager sur Twitter

      [Qt] violation d'accès mémoire

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown