Ошибка сегментации при доступе к объекту QSharedPointer

Я написал небольшой пример кода приложения, как показано ниже.

#include <QCoreApplication>
#include <QSharedPointer>
#include <QDebug>

class INav
{
public:
    virtual int getdata() = 0;
    virtual void setdata(int a) = 0;
};

class Nav : public INav
{
    int i;
public:
    Nav(int a) : i(a) {}

    int getdata() { return i;}
    void setdata(int a) { i = a; }
};

class CMain
{
    Nav* nav;

public:
    CMain(Nav* n) : nav(n) {}
    QSharedPointer<INav> getINav()
    {
        QSharedPointer<Nav> n(nav);
        return n.staticCast<INav>();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QSharedPointer<CMain> m(new CMain(new Nav(1)));

    int i = 0;
    while (++i != 3)
    {
        QSharedPointer<INav> nav = m->getINav();
        qDebug() << nav.data()->getdata();
    }

    return a.exec();
}

когда я напечатаю сообщение отладки во второй раз, оно показывает ошибку сегментации и сбой приложения. Согласно документации QSharedPointer, это может быть удаление указателя в первый раз после доступа к элементу.

Я хочу QSharedPointer nav = m->getINav(); быть в цикле while, поскольку это своего рода фиктивное приложение для моей реальной проблемы сценария.

Я не уверен, как это сделать, любая помощь будет оценена. Заранее спасибо.

1 ответ

Решение

Вы не можете создать более одного объекта shared_ptr (QSharedPointer) по тому же указателю. В этом случае первый уничтоженный разделяемый указатель также уничтожает принадлежащий объект.

Реальный указатель должен инициализировать только один общий указатель. Затем, чтобы скопировать этот указатель, новый общий указатель должен быть инициализирован другим общим указателем, которому принадлежит объект.

Здесь класс CMain должны держать QSharedPointer<Nav> вместо чистого указателя. Получатель должен дать копию этого QSharedPointer, В этом случае объект Nav будет уничтожен только тогда, когда последний его владелец QSharedPointer будет уничтожен

Другие вопросы по тегам