Как работает создание объектов в стеке в Qt «функция / метод»? - PullRequest
0 голосов
/ 16 декабря 2018

Например, у меня есть код, который я часто вижу:

class SomeClass : public QObject
{
    Q_OBJECT
public:
    QHash *parameterTable;
    explicit ExCurrentSession(QObject *parent = nullptr);
};

SomeClass::SomeClass(QObject *parent) : QObject(parent)
{
    parameterTable = new QHash;//used dynamic creation
    QFile file("someFile.txt");//Creating an object on the stack
    if (!file.open(QIODevice::ReadOnly|QIODevice::WriteOnly))
    QTextStream fileSream(&file);//Creating an object on the stack
    QString buff = fileSream.readLine();//Creating an object on the stack
    //...Other code to set the QHash table with a parameter and a value from a file...
}

Вопрос в том, будут ли утечки памяти после выхода из метода:

-QFile file?Я понятия не имею, что там внутри с использованием динамической памяти, может быть, он не используется там. И если он использует в другом подклассе внутри этого класса.

-QTextStream fileSream? Я понятия не имею, что внутри объекта с использованием динамической памятиили нет, может быть, он не используется там. И если он использует в другом подклассе внутри этого класса.

-QString бафф? Я понятия не имею, что внутри объекта, использующего динамическую память или нет, может быть, он там не используется.

Я не понимаю, как определить, возможно ли использовать объект в стеке (метод / функцию), если вы не написали его самостоятельно и не уверены на 100%, что динамическое распределение памяти неиспользуется там.

Может быть, это более правильно?Но почему часто пишут как в первой версии.

SomeClass::SomeClass(QObject *parent) : QObject(parent)
{
    parameterTable = new QHash;//used dynamic creation
    QFile *file = new QFile("someFile.txt");//Creating an object on the stack
    if (!file->open(QIODevice::ReadOnly|QIODevice::WriteOnly))
    QTextStream *fileSream = new QTextStream(file);//Creating an object on the stack
    QString *buff = fileSream->readLine();//Creating an object on the stack
    //...Other code to set the QHash table with a parameter and a value from a file...
    delete file;
    delete fileSream;
    delete buff;
}

1 Ответ

0 голосов
/ 16 декабря 2018

Для "someHash" деструктор также вызывается автоматически?

class SomeClass : public QObject
{
    Q_OBJECT
public:
    QHash<QString,QString> someHash;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...