如果方法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;
}
在析构函数中释放存储的位置?
答案 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
}
内存由智能指针自动释放(QSharedPointer
和std::shared_ptr
还有引用计数,因此在存在共享指针的副本时不会释放内存。