如何在Qt“函数/方法”中的堆栈上创建对象?

时间:2018-12-16 14:10:13

标签: c++ 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%确保在那里不使用动态内存分配。 / p>

也许更正确?但是为什么经常像第一个版本那样写。

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 :(得分:0)

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

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