0

如果方法 GetCurrentStream() 应该更改值 *stream,我对在构造函数(如下所示)或方法本身中动态分配(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;
}

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

4

3 回答 3

2

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

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

如果您需要更改指向对象的指针(例如在 中GetCurrentStream(),您应该提供一种不同的方法来更改流并在此方法中处理必要的解除分配)。
还要记住返回对指针的引用,例如

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

总而言之,它看起来很好,你在那里做了什么。

于 2013-08-12T10:05:59.223 回答
1

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

在 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
}

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

于 2013-08-12T10:40:13.013 回答
1

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

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

可能缺少以下代码示例之类的内容。

QTextStream& GetCurrenStream() {
  ...
  return *stream;
}
于 2013-08-12T10:05:16.043 回答