Why some examples don't delete the pointer member newed in the destructor?



  • E.g in "audio" example :
    widget.h:

    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = 0);
        ~Widget();
    
    private:
        XYSeriesIODevice *m_device;
        QChart *m_chart;
        QLineSeries *m_series;
        QAudioInput *m_audioInput;
    };
    

    widget.cpp:

    Widget::Widget(QWidget *parent)
        : QWidget(parent),
          m_device(0),
          m_chart(0),
          m_series(0),
          m_audioInput(0)
    {
        m_chart = new QChart;
        QChartView *chartView = new QChartView(m_chart);
        chartView->setMinimumSize(800, 600);
        m_series = new QLineSeries;
        m_chart->addSeries(m_series);
        QValueAxis *axisX = new QValueAxis;
        axisX->setRange(0, 2000);
        axisX->setLabelFormat("%g");
        axisX->setTitleText("Samples");
        QValueAxis *axisY = new QValueAxis;
        axisY->setRange(-1, 1);
        axisY->setTitleText("Audio level");
        m_chart->setAxisX(axisX, m_series);
        m_chart->setAxisY(axisY, m_series);
        m_chart->legend()->hide();
        m_chart->setTitle("Data from the microphone");
    
        QVBoxLayout *mainLayout = new QVBoxLayout;
        mainLayout->addWidget(chartView);
        setLayout(mainLayout);
    
        QAudioFormat formatAudio;
        formatAudio.setSampleRate(8000);
        formatAudio.setChannelCount(1);
        formatAudio.setSampleSize(8);
        formatAudio.setCodec("audio/pcm");
        formatAudio.setByteOrder(QAudioFormat::LittleEndian);
        formatAudio.setSampleType(QAudioFormat::UnSignedInt);
    
        QAudioDeviceInfo inputDevices = QAudioDeviceInfo::defaultInputDevice();
        m_audioInput = new QAudioInput(inputDevices,formatAudio, this);
    
        m_device = new XYSeriesIODevice(m_series, this);
        m_device->open(QIODevice::WriteOnly);
    
        m_audioInput->start(m_device);
    }
    
    Widget::~Widget()
    {
        m_audioInput->stop();
        m_device->close();
    }
    
    XYSeriesIODevice *m_device;
    QChart *m_chart;
    QLineSeries *m_series;
    QAudioInput *m_audioInput;
    

    All of them don't have parent to be deleted, but the destructor has not deleted them.


  • Moderators

    @doodle
    because a widget gets the parent set as soon as it is added to a layout, or to be more specific when the layout then gets installed on a widget.
    Some other objects take owndership of the objects when they are passed as parameter.
    Like m_chart to chartView widget, which then gets added to a layout.

    So they are all deleted implicitly when the container widget gets deleted.



  • Got it! :)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.