qt中的动态成员分配

Dynamic members allocation in qt

本文关键字:成员 分配 动态 qt      更新时间:2023-10-16

如果方法GetCurrentStream()应该更改值*流,我不知道在构造函数(如下所示)或方法本身中动态分配(QFile*和QTextStream*)的位置。

头文件

class QLogger {
public:
   explicit QLogger();
   ~QLogger();
   QTextStream& GetCurrenStream();
private:
   QFile *file;
   QTextStream *stream;
};

以及在相关.cpp 中

QLogger::QLogger() {
   file = new QFile;
   stream = new QTextStream;
}
~QLogger() {
   delete file;
   delete stream;
}
QTextStream& GetCurrenStream() {
  ...
  return *stream;
}

在哪里释放析构函数中的存储?

如果您能够在构建对象时为其提供所有必要的数据,那么您应该将所有初始化都放在构造函数中,因为它会创建实际的对象。通过这种方式,您可以确保您的对象在使用时准备就绪。
如果您没有使用任何特殊的模式,那么getter不应该创建它们返回的对象,而应该创建一个引用,就像您在GetCurrentStream()中所做的那样。

其次,对于析构函数,这是从分配的对象中释放内存的实际位置。如果您有可能很危险的释放进程,则应该为此提供一个额外的方法,因为如果析构函数中出现故障,您将经历内存泄漏。此外,永远不要在析构函数中抛出异常!

如果您需要更改指向对象的指针(就像在GetCurrentStream()中一样,您应该提供一种不同的方法来更改流,并在该方法中处理必要的释放)
还记得返回对类似的指针的引用

return *stream; //return reference to actual object, not the pointer!

总的来说,你在那里做的一切看起来都很好。

您所做的似乎是正确的。在构造函数中分配对象,然后在析构函数中删除它们。

但是,它不应该按原样构建,因为GetCurrentStream()应该返回对流对象的引用,而您当前正在返回一个指针。

下面的代码示例可能就是缺失的部分。

QTextStream& GetCurrenStream() {
  ...
  return *stream;
}

考虑使用智能指针来管理动态分配的对象。

在Qt中,您可以使用QScopedPointer(在C++11中也有std::unique_ptr)。

(正如上面评论中提到的:Q*名称基本上由Qt东西保留。)

class Logger {
public:
   Logger();
   QTextStream& getCurrenStream();
private:
   QScopedPointer<QFile> file;
   QScopedPointer<QTextStream> stream;
};
Logger::Logger()
    : file(new QFile)
    , stream(new QTextStream)
{
}
QTextStream& getCurrenStream() {
  // ...
  return stream.data(); // stream.get() with std::unique_ptr
}

智能指针会自动释放内存(对于QSharedPointerstd::shared_ptr,还有额外的引用计数,因此在存在共享指针副本时不会释放内存)。