首页 > 解决方案 > Qt“函数/方法”中在堆栈上创建对象是如何工作的?

问题描述

例如,我有我经常看到的代码:

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 文件?我不知道里面有什么使用动态内存,也许它没有在那里使用。如果它在这个类的另一个子类中使用。

-QTextStream fileSream?我不知道对象内部有什么使用动态内存,也许它没有在那里使用。如果它在这个类的另一个子类中使用。

-QString buff?我不知道使用动态内存的对象内部是什么,也许它没有在那里使用。

如果您没有自己编写并且不能 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;
}

标签: c++qt

解决方案


对于“someHash”,析构函数也会自动调用吗?

class SomeClass : public QObject
{
    Q_OBJECT
public:
    QHash<QString,QString> someHash;
};

推荐阅读