qt中的动态成员分配

时间:2013-08-12 09:56:53

标签: c++ qt

如果方法GetCurrentStream()应该更改值* stream,我会对构造函数(如下所示)或方法本身动态分配(QFile *和QTextStream *)的位置感到困惑。 / p>

标题文件

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

在析构函数中释放存储的位置?

3 个答案:

答案 0 :(得分:2)

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

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

如果需要更改指向对象的指针(比如GetCurrentStream(),则应该提供一种不同的方法来更改流并在此方法中处理必要的释放)。
还记得返回对像

这样的指针的引用
return *stream; //return reference to actual object, not the pointer!

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

答案 1 :(得分:1)

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

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

下面的代码示例可能是缺少的东西。

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

答案 2 :(得分: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
}

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