Например, у меня есть код, который я часто вижу:
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;
}